perm filename PPCP.FAI[NET,GUE] blob sn#014265 filedate 1972-11-29 generic text, type T, neo UTF8
;AC'S, BITS, RETICLES(PC), BOX SIZES

ITSSW←←0
IFDEF .IOT,<ITSSW←←-1>
IFNDEF PCSW{DSW←←1
PCSW←←0}
IFN PCSW,<DSW←←0>
DEFINE ITS<IFN ITSSW>
DEFINE NOITS<IFE ITSSW>
DEFINE MD<IFN DSW>
DEFINE MPC<IFN PCSW>
MD,{TITLE P}
MPC,{TITLE PCP}

EXTERNAL PLOTS,PLOT,SYMBOL,WHERE,SETXY,REF,JOBFF,JOBREL,ROTIT
ITS,<
EXTERNAL ITSGO
>;ITS

OPDEF DSKPPN[CALLI 400071]

MAXVER←←2		;MAXIMUM VERSION # WE KNOW ABOUT

;AC'S:

A←1
B←2
C←3
D←4
E←5
F←6
G←7
H←10
I←11
FLAG←12		;FLAG WORD
T←13
TT←14
TTT←15
P←17

ITS,<NOLIT↔XALL>

;FLAG BITS FOUND IN FLAG
MPC,{
DOMAG←←1		;MAKING TRW MAGTAPE
DOTAPE←←2		;MAKING DRILL TAPE
PLANE←←4		;THIS IS AN INNER PLANE
TRWDRL←←10		;DRILL HOLES ONLY
};MPC
MD,{
PRODUCE←←1		;FR80 PRODUCTION RUN!
};MD
FR80←←20		;FR80 OUTPUT
IKNOW←←40		;I KNOW WHERE I WAS LAST
%DOPLT←←100		;PLOTTING ON CALCOMP
IFLAG←←400	;READING INDIRECT DESCRIPTOR
IREAD←←1000	;READING INDIRECT FILE
RSTENB←←2000	;ENABLE RESTART CAPABILITY


MPC,{
;1/2 WIDTH OF CONNECTOR FINGER IN MILS
FWIDTH←←=40

;RETICLE DEFINITIONS
LINRET←←1		;LINE DRAWING
TXTRET←←2		;TEXT DRAWING
IPBRET←←3		;INNER PLANE BORDER
FNGRET←←4		;FINGERS
TARRET←←5		;TARGETS
DONUT←←6		;FIRST PAD MUST BE DONUT
	;7		NORMAL PAD
	;8		INNER PLANE CLEARANCE
	;9		PIN 1 SQUARE
};MPC

MD,{
;DRAWING SIZES ***********
;A	8.5 X 11
AH←←(=8500-=500)/5
AW←←(=11000-=500)/5

;B	11 X 17
BH←←(=11000-=1000)/5
BW←←(=17000-=1000)/5

;C	17 X 22
CH←←(=17000-=1000)/5
CW←←(=22000-=1000)/5

;D	22 X 28
DH←←(=22000-=1000)/5
DW←←(=34000-=1000)/5
};MD

;PRACTICAL BOUNDS OF FR80 FRAME
FRMAX←←400000	;SIZE OF FR80 IMAGE SQUARE (16384)
		;MUST BE POWER OF 2!!!!!!
FRXFDG←←0	;FULL X
FRYFDG←←=2000	;TAKE OFF 2000 POINTS ON TOP AND BOTTOM

TFLG←←2

CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,


;IO CHANNEL ASSIGNMENTS

TRWCHN←←0
SIG←←1
F80CHN←←2
ICHN←←3
DAT←←5
TAP←←6

;DEFINITIONS FOR SORT PACKAGE
TEXP←←5		;NUMBER OF BITS OF SIGNIFICANCE IN X,Y'S
TSIZ←←1⊗TEXP	;NUMBER OF TABLE ENTRIES PER DIMENSION
TSQR←←TSIZ*TSIZ	;TOTAL SIZE OF TABLE

DEFINE GETFS(AC)
<	SKIPN AC,FSTPNT
	PUSHJ P,NOFST
	PUSH P,(AC)
	POP P,FSTPNT
>

DEFINE FSTRET(AC)
<	HLLI AC,
	EXCH AC,FSTPNT
	HRRZM AC,@FSTPNT
>
;DATA AND MACROES
DEFINE DATA(LABEL,D.PC,SIZE)
{
IFIDN {D.PC}{D}{
MD,{SDATA(LABEL,SIZE)}
}
IFIDN {D.PC}{PC}{
MPC,{SDATA(LABEL,SIZE)}
}
IFIDN {D.PC}{BOTH}{
SDATA(LABEL,SIZE)
}
};DATA

DEFINE SDATA(LABEL,SIZE)
{
LABEL:
IFIDN {SIZE}{}{0}
IFDIF {SIZE}{}{BLOCK SIZE}
};SDATA

DOPLT:	REF
INTERNAL DOPLT


DATA	TOPS,BOTH,TSQR
DATA	FSTPNT,BOTH
DATA	FSTTOP,BOTH
DATA	T1SI,BOTH
DATA	T2SI,BOTH
DATA	LOOPY,BOTH
DATA	MINX,BOTH
DATA	MINY,BOTH
DATA	MAXX,BOTH
DATA	MAXY,BOTH
DATA	DIVX,BOTH
DATA	DIVY,BOTH
DATA	DRAWL,BOTH
DATA	CURX,BOTH
DATA	CURY,BOTH
DATA	VALBST,BOTH
DATA	POSBST,BOTH

DATA	%ROTIT,BOTH
DATA	PDL,BOTH,200
DATA	INBUF,BOTH,3
DATA	IBUF,BOTH,210*2
DATA	STR0,D,10
DATA	STR1,D,10
DATA	STR2,D,40
DATA	STR3,D,40
DATA	LSTRET,PC
DATA	BIGPAD,PC
DATA	STRING,PC,=200/5
DATA	MAGBUF,PC,3
DATA	MAGBFR,PC,210*2
DATA	TAPHD,PC,3
DATA	TAPBUF,PC,210*2
DATA	FRBUF,BOTH,3
DATA	FRBFR,BOTH,210*2
DATA	LASTX,BOTH
DATA	LASTY,BOTH
DATA	LSTROT,BOTH
DATA	LSTSPC,BOTH
DATA	FRFUDG,BOTH
DATA	SAVNAM,BOTH
DATA	SAVEXT,D
DATA	SAVPPN,BOTH
DATA	FILNAM,BOTH
DATA	FILEXT,BOTH
DATA	FILDAT,BOTH
DATA	FILPPN,BOTH
DATA	IBUFR,BOTH,3
DATA	IBUFRD,BOTH,210
DATA	CRDNUM,PC
DATA	THING1,BOTH
DATA	T3S,BOTH
DATA	T3P,BOTH
DATA	T2S,BOTH
DATA	T2P,BOTH
DATA	T1S,BOTH
DATA	T1P,BOTH
DATA	XOFF,BOTH
DATA	YOFF,BOTH
DATA	PVER,BOTH
DATA	DOTXT,PC
DATA	ANGLE,BOTH
DATA	CSIZZ,BOTH
DATA	Y,BOTH
DATA	X,BOTH
DATA	MAGWRD,PC
DATA	EXTSAV,BOTH
DATA	SMLY,BOTH
DATA	SMLX,BOTH
DATA	LRGX,BOTH
DATA	LRGY,BOTH
DATA	CURSE,BOTH
DATA	SCALE,BOTH
DATA	ANYTXT,PC
DATA	CSIZ,PC
DATA	MTAB,PC,5
DATA	WIDTH,D
DATA	OFFSET,D
DATA	HEIGHT,D
DATA	BRDPNT,D
DATA	SIGNAM,D
DATA	SIGEXT,D
DATA	SIGDAT,D
DATA	SIGPPN,D
DATA	DRWDAT,D
DATA	STOP,D
DATA	START,D
DATA	PADNUM,PC
DATA	DIALOC,D
DATA	CENTER,BOTH
DATA	PARG,D
DATA	PATCH,BOTH,100
DATA	SAVEP,BOTH
DATA	SX,BOTH
DATA	SY,BOTH
DATA	RSTCNT,BOTH
DATA	RSTSET,BOTH

SWAP:	'DSK   '
	'PLOT00'
	0
SIZE:	XWD 0,PLTRST
	0
;RESTART CODE!
SAVE:	MOVE T,RSTSET		;TRY 100 COMMANDS FOR NOW
	MOVEM T,RSTCNT
	TRNN FLAG,RSTENB	;CAN HE DO THIS?
	POPJ P,
	PUSHJ P,FORCE
	OUTSTR[ASCIZ/SAVING/]
FOR I←0,16
<	PUSH P,I
>
	MOVEM P,SAVEP
	MOVE T,JOBREL
	ADDI T,1777
	LSH T,-12
	HRLM T,SIZE
	JSA 16,WHERE
	JUMP SX
	JUMP SY
	MOVE 1,SY
	HRL 1,SX
	MOVSI 3,SWAP
	CALLI 3,400004
MERGE:	JSA 16,PLOTS
	JUMP THING1
	SKIPE THING1
	JRST [	OUTSTR[ASCIZ/FAILURE TO RESTART, PLOTTER NOT AVAILABLE!
/]
		HALT MERGE]
	SKIPE %ROTIT
	SETOM ROTIT		;PRESERVE ORIENTATION
	JSA 16,SETXY		;SET X,Y TO CONTENTS OF 1
	MOVE P,SAVEP
FOR I←16,0,-1
<	POP P,I
>
	OUTSTR[ASCIZ/
/]
	POPJ P,

PLTRST:
MD,{	MOVE 1,START	}
MPC,{	SETZ 1,		}
	JRST MERGE
;ASK FR80, ASK TRW(PC), ASK SCALE(PC), ASK OFFSET(PC), ASK PLOT
;SET PLOT FILE INPUT
FRSET:	OUTSTR[ASCIZ/FR-80 PLOT TAPE?/]
	PUSHJ P,GETYES
	POPJ P,
	TRO FLAG,FR80		;FLAG FOR FR80 OUTPUT
MPC,{	OUTSTR[ASCIZ/AT FR80 SCALE OF 3.7 FRAME IS ABOUT 22X17.
FR80 SCALE*10 ?/]
};MPC
MD,{	OUTSTR[ASCIZ/IS THIS A PRODUCTION RUN (ALL DEFAULT ANSWERS)?/]
	PUSHJ P,GETYES
	CAIA
	JRST [	TRO FLAG,PRODUCE
		MOVEI TTT,=37
		JRST SETFDG]
	OUTSTR[ASCIZ/AT FR80 SCALE OF 3.7 SIZE C JUST FITS (22X17).
FR80 SCALE*10 ?/]
};MD
	PUSHJ P,DECIN
	JRST [	OUTSTR[ASCIZ/HO HO HO!
TRY AGAIN!/]
		PUSHJ P,IERR
		JRST .-1]
	JUMPN TTT,SETFDG
	OUTSTR[ASCIZ/USING 37!
/]
	MOVEI TTT,=37
SETFDG:	MOVEM TTT,FRFUDG
	CAIN TTT,=37			;DID HE USE STANDARD?
	POPJ P,				;YES, THAT'S ALL
	OUTSTR[ASCIZ/FR80 FRAME IS /]
	MOVE T,[FRMAX*=50]
	IDIV T,FRFUDG
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ X /]
	MOVE T,[(FRMAX-2*FRYFDG)*=50]
	IDIV T,FRFUDG
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ INCHES.
/]
	POPJ P,

MPC,{
TRWSET:	OUTSTR[ASCIZ/TRW PLOT TAPE?/]
	PUSHJ P,GETYES
	POPJ P,
	TRO FLAG,DOMAG
	OUTSTR[ASCIZ/ADD SYMBOL DEFINITIONS?/]
	PUSHJ P,GETYES
	POPJ P,
	OUTSTR[ASCIZ/SYMBOL DEFINITIONS LIVE FOR EVER (IN THIS CORE IMAGE).
BE SURE TO MAKE A SKETCH OF THE SYMBOL INDICATING THE "D" CODE.
/]
	MOVEI A,=60		;START AT 60
CHRDEF:	MOVEI B,177		;SCAN TABLE FOR THIS ONE
	CAME A,ONETAB(B)	;THERE ALREADY?
	SOJGE B,.-1		;NO, LOOP
	JUMPGE B,ISDEF		;FIND ONE?
	OUTCHR["D"]
	MOVE T,A
	PUSHJ P,DECOUT
	OUTCHR["?"]
	PUSHJ P,GETCH
	OUTSTR[ASCIZ/
/]
	ANDI T,177
	CAIN T,12
	POPJ P,				;QUIT ON CRLF
	SKIPE ONETAB(T)
	JRST [	OUTSTR[ASCIZ/ALREADY DEFINED AS "D/]
		MOVE T,ONETAB(T)
		PUSHJ P,DECOUT
		OUTSTR[ASCIZ/"
/]
		JRST CHRDEF]
	MOVEM A,ONETAB(T)
	JRST NEWDEF
ISDEF:	OUTCHR["D"]
	MOVE T,A
	PUSHJ P,DECOUT
	OUTCHR["="]
	OUTCHR B
	OUTSTR[ASCIZ/
/]
NEWDEF:	CAIGE A,=99
	AOJA A,CHRDEF				;LOOP UP TO 99
	POPJ P,

GETSCL:	OUTSTR[ASCIZ/SCALE FACTOR?/]
	PUSHJ P,DECIN
	JRST [	PUSHJ P,IERR
		JRST GETSCL]
	JUMPN TTT,.+3
	MOVEI TTT,1
	OUTSTR[ASCIZ/USING SIZE 1!
/]
	MOVEM TTT,SCALE
	POPJ P,

GETOFF:	OUTSTR[ASCIZ/POSITIVE X,Y OFFSET (IN INCHES, DECIMAL POINT OK!)?/]
	PUSHJ P,MILIN
	CAIE T,","
	JRST [	CAIN T,12
		JUMPE TTT,DEFOFF
	ILLOUT:	PUSHJ P,IERR
		JRST GETOFF]
	MOVEM TTT,XOFF
	PUSHJ P,MILIN
	CAIE T,12
	JRST ILLOUT
	MOVEM TTT,YOFF
	TRNE FLAG,FR80
	OUTSTR[ASCIZ/OFFSET IS IGNORED FOR FR80 OUTPUT!
/]
	POPJ P,

DEFOFF:	TRNE FLAG,DOMAG
	JRST TRWOFF
	SETZM XOFF
	SETZM YOFF
	POPJ P,

TRWOFF:	OUTSTR[ASCIZ/USING 12 X 10!
/]
	MOVEI T,=12000/5
	MOVEM T,XOFF
	MOVEI T,=10000/5
	MOVEM T,YOFF
	POPJ P,
};MPC

NAMSET:	SETZM SAVNAM			;FORGET SAVED NAME FOR NEW FILE
MPC,{	ANDI FLAG,DOMAG!FR80!%DOPLT!IREAD	}
MD,{	ANDI FLAG,PRODUCE!FR80!%DOPLT!IREAD	}
	INIT DAT,10
	SIXBIT /DSK/
	PZE INBUF
	JRST [OUTSTR [ASCIZ /DSK NOT AVAIL -- WHAT THE FUCK?/]
		HALT NAMSET]
ASKHIM:	OUTSTR[ASCIZ/PLOT /]
	PUSHJ P,SETPLT
	JRST .-1
	MOVE T,FILNAM
	MOVEM T,SAVNAM			;SAVE FILENAME FOR PLOT BOX AND FR80 NAME
MD,{
	MOVE T,FILEXT
	MOVEM T,SAVEXT
};MD
	MOVE T,FILPPN
	MOVEM T,SAVPPN
	LOOKUP DAT,FILNAM
	JRST [OUTSTR [ASCIZ /CAN'T FIND IT!
/]
		JRST ASKHIM]
	MOVE T,JOBFF
	ADDI T,4000
	CALLI T,11
	JRST 4,.-3
	MOVEI TT,IBUF
	EXCH TT,JOBFF
	INBUF DAT,2
	MOVEM TT,JOBFF
	ADDI TT,10
	MOVE T,JOBREL
	SUB T,TT
	MOVEM TT,T3S
	MOVEM TT,T3P
	IDIVI T,3
	MOVE TT,T
	ADD TT,T3S
	MOVEM TT,T2S
	MOVEM TT,T2P
	ADD T,TT
	MOVEM T,T1S
	MOVEM T,T1P
	HRLOI T,377777
	MOVEM T,SMLY
	MOVEM T,SMLX
	MOVSI T,400000
	MOVEM T,LRGY
	MOVEM T,LRGX
MPC,{	SETOM BIGPAD	}
	POPJ P,
;READ A WORD FROM FILE
IN:	SOSG INBUF+2
	IN DAT,
	CAIA
	HALT .+1
	ILDB A,INBUF+1
	POPJ P,
;INPUT LOOP, PUT LINES IN TABLES
MAIN:	PUSHJ P,IN
	HLRZ T,A
	CAIE T,400001
	JRST MAINLP
	SETZM LRGX
	SETZM LRGY
	SETZM SMLX
	SETZM SMLY
	POPJ P,

MAINLP:	HLRZ T,A
	CAIN T,400001		;END OF FILE?
	JRST [	HLRES LRGX
		HLRES SMLX
		POPJ P,]
	TLNE A,1	;TEXT?
	JRST INTXT	;YES, GET IT IN
	TDZ A,[(1)1]
	MOVE T,A
	PUSHJ P,PUT1	;PUT X,Y IN TABLE 1
	MOVE T,T3P	;GET TABLE 3 POINTER (POINT TO START OF LINE)
	HRLI T,		;0 MEANS START OF LINE
	PUSHJ P,PUT2	;PUT POINTER IN TABLE 2
INLLOP:	MOVE T,A
	PUSHJ P,SCHECK	;CHECK MAX'S
	PUSHJ P,PUT3	;PUT IN TABLE 3
	PUSHJ P,IN	;GET NEXT THING
	TRZN A,1	;STILL IN THIS LINE?
	JRST INLDON	;NO, FINISH UP
	TDZ A,[(1)1]	;YES, CLEAR EXTRA BITS
	JRST INLLOP
INLDON:	PUSHJ P,PUT1	;PUT LAST X,Y IN TABLE 1
	MOVE T,T3P	;GET POINTER TO IT IN...
	SUBI T,1	;TABLE 3
	HRLI T,1	;1 MEANS END OF LINE
	PUSHJ P,PUT2	;PUT POINTER IN TABLE 2
	JRST MAINLP
;PUT TEXT INTO TABLES, SCHECK
INTXT:	TDZ A,[(1)1]
	MOVE T,A	;GET X,Y OF TEXT
	MOVE B,A	;SAVE IN B ALSO
	PUSHJ P,SCHECK
	PUSHJ P,PUT1	;PUT IT IN TABLE 1
	MOVE T,T3P	;GET POINTER TO TABLE 3
	HRLI T,2	;2 MEANS TEXT
	PUSHJ P,PUT2	;PUT POINTER IN TABLE 2
	PUSHJ P,IN
	MOVE T,A
	PUSHJ P,PUT3	;STORE SIZE (OR WHATEVER) AWAY
	HLRZ T,A
	JUMPN T,ISNTXT	;TEXT?
MPC,{	TRZE A,16
	OUTSTR[ASCIZ/ODD CHAR SIZE, I EVENED IT!
/]
	MOVE T,A
	ANDI T,377776
	LSH T,-4
	CAILE T,4	;ALLOW HIM TO USE OUR SPECIAL SIZE
	JRST [	OUTSTR[ASCIZ/CHAR SIZE TO LARGE, WILL USE 4!
/]
		MOVEI T,4
		DPB T,[POINT 13,A,31]
		JRST .+1]
	SKIPG MTAB(T)
	JRST [	SOS T1P
		SOS T2P
		SOS T3P
		SETOM MTAB(T)	;NOTE THAT WE FLUSHED SOME
	SKPTXT:	PUSHJ P,IN
		TRZE A,1
		JRST SKPTXT
		JRST MAINLP]
	SETOM ANYTXT		;NOTE THAT WE FOUND SOME TEXT
};MPC
	PUSH P,A
	PUSH P,B	;SAVE INITIAL X,Y
	MOVNI T,2	;MAKE BELIEVE LAST WORD FULL!
	SETZ B,		;NO WORDS YET!
TXTIN:	PUSHJ P,IN
	TRZN A,1	;END?
	SOJA B,TXTFIX	;YES
	MOVE T,A
	PUSHJ P,PUT3
	AOJA B,TXTIN	;COUNT 1 WORD AND LOOP

TXTFIX:	MOVE A,T
	TRNN A,376	;LAST WORD END IN 0?
	JRST TXTFX1	;YES
	SETZ T,		;NO, PUT 0
	PUSHJ P,PUT3	;IN TABLE 3
TXTFX1:	MOVE T,T3P
	ADD T,[2,,-1]	;3,,T3 POINTER
	PUSHJ P,PUT2	;TO TABLE 2
	IMULI B,5	;COUNT 5 CHARS PER WORD READ
	JUMPE A,TXTFX2	;0 WORD?
TXTFX3:	ADDI B,1	;NO, COUNT ANOTHER CHAR
	LSH A,7		;SHIFT THAT CHAR OUT
	JUMPN A,TXTFX3	;LOOP TILL 0
TXTFX2:	POP P,T		;GET BACK INITIAL X,Y
	POP P,TTT	;GET BACK CHAR SIZE
	TRNN TTT,400000	;VERT?
	TLOA B,1	;YES, NEG TO LEFT HALF
	TLOA B,1		;NO, POS TO LEFT HALF
	MOVS B,B	;SWAP FOR HORZ TEXT
	MOVE TT,TTT	;GET COPY OF SIZE
MD,{	ANDI TT,377777
	LSH TT,-1	;NORMALIZE IT
	IMUL B,TT	;MULT BY APPROPRIATE CONSTANT
};MD
MPC,{	ANDI TT,377777
	LSH TT,-4
	IMUL B,MTAB(TT)	;MULT BY APPROPRIATE CONSTANT
	IDIV B,SCALE
};MPC
	ADD B,T		;ADD INITIAL X,Y
	TLZ B,1
	MOVE A,B
	PUSHJ P,SCHECK	;CHECK OTHER CORNER OF BOX
	TRNE TTT,400000
	JRST [	HRR T,B
		JRST .+2]
	HLL T,B
	PUSHJ P,PUT1	;STORE END OF TEXT IN TABLE 1
	LDB A,INBUF+1
	JRST MAINLP

ISNTXT:
MPC,{	HRRZ T,A
	LSH T,-1
	CAMLE T,BIGPAD	;BIGGEST PAD NUMBER?
	MOVEM T,BIGPAD	;NO, SAVE AS BIGGEST SO FAR
};MPC
	MOVE T,T2P
	MOVEI TT,4
	HRLM TT,-1(T)	;CHANGE CODE
	PUSHJ P,IN
	JRST MAINLP	;NEXT WHAT EVER

SCHECK:	CAMGE A,SMLX
	MOVEM A,SMLX
	CAMLE A,LRGX
	MOVEM A,LRGX
	HRRES A
	CAMGE A,SMLY
	MOVEM A,SMLY
	CAMLE A,LRGY
	MOVEM A,LRGY
	POPJ P,
;TABLE SUBRS
PUT1:	MOVEM T,@T1P
	AOS TT,T1P	;GET POINTER & INCREMENT
	CAMG TT,JOBREL	;OVERFLOW OF TABLE?
	POPJ P,		;NO
	JRST GETCOR

PUT2:	MOVEM T,@T2P	;DEPOSIT WORD
	AOS TT,T2P	;GET POINTER AND INCREMENT
	CAMGE TT,T1S	;OVERFLOW OF TABLE?
	POPJ P,		;NO
	MOVE TT,T1S	;GET TABLE 1 START POINTER
	HRLS TT
	ADDI TT,2000
	HRRZM TT,T1S
	PUSHJ P,DOBLT	;MOVE TABLE 1 DOWN
	MOVEI TT,2000
	ADDM TT,T1P	;UPDATE TABLE 1 POINTER
	POPJ P,

PUT3:	MOVEM T,@T3P	;DEPOSIT WORD
	AOS TT,T3P	;GET AND INCREMENT POINTER
	CAMGE TT,T2S	;TABLE OVERFLOW?
	POPJ P,		;NO
	MOVE TT,T2S
	HRLS TT
	ADDI TT,2000
	HRRZM TT,T2S
	PUSHJ P,DOBLT
	MOVEI TT,2000
	ADDM TT,T2P
	ADDM TT,T1P
	ADDM TT,T1S
	POPJ P,

DOBLT:	PUSHJ P,GETCOR
	MOVE TTT,JOBREL
DOBLOP:	CAIGE TTT,2000(TT);MORE THAT 1K TO BLT?
	JRST JUSTDO	;NO
	PUSH P,TT
	MOVE TT,TTT
	SUBI TT,3777
	HRLS TT
	ADDI TT,2000
	BLT TT,(TTT)
	SUBI TTT,2000
	POP P,TT
	JRST DOBLOP
JUSTDO:	BLT TT,(TTT)
	POPJ P,

GETCOR:	MOVE TTT,JOBREL
	ADDI TTT,2000
	CALLI TTT,11
	CAIA
	POPJ P,
	OUTSTR[ASCIZ/NO CORE AVAILABLE, CONTINUE TO TRY AGAIN!
/]
	HALT GETCOR
;FREE STORAGE ROUTINES
FSTINI:	SETZM FSTPNT
	MOVE T,T1P	;GET TOP OF CORE
	MOVEM T,FSTTOP	;SET AS CURRENT NXM
	POPJ P,

NOFST:	SOS (P)
	SOS (P)		;RETURN TO SKIPN
	PUSH P,T	;SAVE AN AC
NOFST2:	MOVE T,FSTTOP
	MOVEM T,FSTPNT	;NEW FREE STORAGE POINTER
	ADDI T,1777	;GET AT LEAST 1K
	CALLI T,11
	HALT NOFST2
	AOS T,FSTTOP
NOFST1:	HRRZM T,-1(T)
	CAMG T,JOBREL
	AOJA T,NOFST1
	SETZM -1(T)
	MOVEM T,FSTTOP	;NEW NXM
	POP P,T
	POPJ P,
;FIND CLOSEST
CLFND:	SKIPN A,DRAWL
	POPJ P,			;END
	HRRZ T,(A)
	MOVEM T,DRAWL
	MOVE B,A
	HLRZ A,(A)
	ADD A,T2S
	FSTRET(B)
	POPJ P,

;SORT TABLES T1 AND T2 INTO LIST DRAWL
SORT:	MOVE	I,T1S
	TLO	I,I		;INDEX BY I
	MOVEM	I,T1SI		;INITIALIZE
	SUB	I,T1P
	HRLZ	I,I
	MOVEM	I,LOOPY
	JUMPE	I,[	SETZM	DRAWL	;EMPTY LIST
			POPJ	P,]
	HLRE	E,@T1S
	MOVE	G,E
	HRRE	F,@T1S
	MOVE	H,F
MAMI:	HLRE	B,@T1SI		;FIND MIN, MAX X,Y
	HRRE	C,@T1SI
	CAML	E,B
	MOVE	E,B
	CAMG	G,B
	MOVE	G,B
	CAML	F,C
	MOVE	F,C
	CAMG	H,C
	MOVE	H,C
	AOBJN	I,MAMI		;SAVE THEM
	MOVEM	E,MINX
	MOVEM	F,MINY
	MOVEM	G,MAXX
	MOVEM	H,MAXY
	SUB	G,E
	ASH	G,-TEXP		;CALCULATE MAPPING 
	ADDI	G,1		;CONSTANTS
	MOVEM	G,DIVX
	SUB	H,F
	ASH	H,-TEXP
	ADDI	H,1
	MOVEM	H,DIVY
	MOVE	D,[XWD TOPS,TOPS+1] ;CLEAR MAP
	SETZM	TOPS
	BLT	D,TOPS+TSQR-1
	MOVE	I,T2S
	TLO	I,I
	MOVEM	I,T2SI
	MOVE	I,LOOPY
PUSHR:
MPC,{
	HLRZ D,DOTXT		;PICKUP INDEX OF WHAT WE SHOULD DO
	HLRZ B,@T2SI
	XCT (D)1+[	CAIN B,3	;EVERY THING BUT END TEXT
			CAILE B,1	;0
			CAILE B,1	;1
			CAIE B,2	;2
			JFCL		;3
			PUSHJ P,[HRRZ B,@T2SI
				HRRZ B,(B)
				LSH B,-1	;SHIFT IT!
				TLO B,4
				CAMN B,DOTXT	;SAME PAD #?
				AOS (P)
				POPJ P,]];4
};MPC
MD,{
	HLRZ B,@T2SI
	CAIN B,3			;DON'T LOOK AT END OF TEXT
};MD
	JRST SKIPIT
	HLRE	B,@T1SI		;PUT ALL POINTS
	SUB	B,E		;INTO THE MAP
	IDIV	B,G
	HRRE	C,@T1SI
	SUB	C,F
	IDIV	C,H
	LSH	C,44-TEXP
	LSHC	B,TEXP
	MOVE	C,TOPS(B)
	HRL	C,I
	GETFS	D
	MOVEM	C,(D)
	MOVEM	D,TOPS(B)
SKIPIT:	AOBJN	I,PUSHR
	SETZM	DRAWL
	HLRE	F,CURSE		;GET OUR INITIAL POS.
	HRRE	G,CURSE
	CAMGE	F,MINX		;NOW GENERATE DRAWING LIST
	MOVE	F,MINX
	CAMLE	F,MAXX
	MOVE	F,MAXX
	CAMGE	G,MINY
	MOVE	G,MINY
	CAMLE	G,MAXY
	MOVE	G,MAXY
	MOVEI	E,DRAWL
NEWPNT:	MOVEM	F,CURX
	MOVEM	G,CURY
	SUB	F,MINX
	IDIV	F,DIVX
	MOVE	B,F
	MOVE	G,CURY
	SUB	G,MINY
	IDIV	G,DIVY
	MOVE	C,G
	LSH	G,44-TEXP
	LSHC	F,TEXP
	MOVEI	H,TSQR*4
	MOVEI	I,0
TRYUM:	MOVEI	G,TOPS(F)	;SPIRAL SCAN IF GRID POINT
	SKIPE	(G)		;WAS EMPTY
	JRST	CONTIN
MT1:	ADDI	I,1
	MOVE	D,I
LP1:	SOJLE	H,DONEM
	ADDI	B,1
	ADDI	F,TSIZ
	TRNN	B,-TSIZ
	TRNE	C,-TSIZ
	JRST	NT1
	MOVEI	G,TOPS(F)
	SKIPE	(G)
	JRST	CONTIN
NT1:	SOJG	D,LP1
	MOVE	D,I
LP2:	SOJLE	H,DONEM
	ADDI	C,1
	ADDI	F,1
	TRNN	B,-TSIZ
	TRNE	C,-TSIZ
	JRST	NT2
	MOVEI	G,TOPS(F)
	SKIPE	(G)
	JRST	CONTIN
NT2:	SOJG	D,LP2
	ADDI	I,1
	MOVE	D,I
LP3:	SOJLE	H,DONEM
	SUBI	B,1
	SUBI	F,TSIZ
	TRNN	B,-TSIZ
	TRNE	C,-TSIZ
	JRST	NT3
	MOVEI	G,TOPS(F)
	SKIPE	(G)
	JRST	CONTIN
NT3:	SOJG	D,LP3
	MOVE	D,I
LP4:	SOJLE	H,DONEM
	SUBI	C,1
	SUBI	F,1
	TRNN	B,-TSIZ
	TRNE	C,-TSIZ
	JRST	NT4
	MOVEI	G,TOPS(F)
	SKIPE	(G)
	JRST	CONTIN
NT4:	SOJG	D,LP4
	JRST	MT1
CONTIN:	HRLZI	I,200000	;INFINITY
	MOVEM	I,VALBST	;FIND CLOSEST
FINDR:	MOVE	H,G		;POINT IN THIS
	HRRZ	G,(G)
	HLRZ	I,(G)
	HLRE	B,@T1SI
	SUB	B,CURX
	IMUL	B,B
	HRRE	C,@T1SI
	SUB	C,CURY
	IMUL	C,C
	ADD	B,C
	CAML	B,VALBST	;THIS PNT BETTER?
	JRST	NXT
	MOVEM	H,POSBST	;IF S, RECORD IT
	MOVEM	B,VALBST
NXT:	HRRZ	I,(G)
	JUMPN	I,FINDR		;GO BAK IF NOT FINSHD
PUTIN:	MOVE	G,POSBST	;SET UP BEST POINT
	MOVE	H,(G)		;FOR DRAWING
	HRRZ	D,(H)
	HRRM	D,(G)
	HLRM	D,(H)
	HRRM	H,(E)
	MOVE	E,H
	HLRZ	I,(H)
	HLRZ	D,@T2SI		;WHAT TYPE OF 'POINT'
	CAIN	D,4		;A REAL ONE ?
	JRST	SETNEW
	JUMPN	D,L1		;BEGINING OF A LINE?
	ADDI	I,1		;IF SO, REMOVE THE
OUTOUT:	HLRE	B,@T1SI		;OTHER END OF IT
	SUB	B,MINX
	IDIV	B,DIVX
	HRRE	C,@T1SI
	SUB	C,MINY
	IDIV	C,DIVY
	LSH	C,44-TEXP
	LSHC	B,TEXP
	MOVEI	G,TOPS(B)
NTR:	MOVE	H,G
	MOVE	G,(G)
	HLRZ	D,(G)
	CAIE	I,(D)
	JRST	NTR
	MOVE	D,(G)
	HRRM	D,(H)
	FSTRET	G
	JRST	SETNEW
L1:	CAIE	D,1		;END OF LINE?
	JRST	L2
	SUBI	I,1
	JRST	OUTOUT
L2:	ADDI	I,1
SETNEW:	HLRE	F,@T1SI		;GET READY FOR
	HRRE	G,@T1SI		;NEXT POINT
	JRST	NEWPNT
DONEM:	POPJ P,
;SQRT:	FINDS THE SQUARE ROOT OF THE INTEGER IN T.  USES TT AND TTT
SQRT:	JFFO T,.+2	;FIND THE HIGH ORDER BIT
	POPJ P,		;ZERO?
	SUBI TT,=37
	MOVNS TT
	LSH TT,-1
	MOVEI TTT,1
	LSH TTT,-1(TT)	;MAKE WORD WITH HALF AS MANY LOW ORDER BITS
	TRO TFLG	;TURN ON TEMP (COUNT) FLAG
SLOP1:	MOVE TT,TTT	;GET APROXIMATE SQRT
	IDIVM T,TT	;DIVIDE IT INTO THE SQUARE
	ADD TT,TTT	;ADD APROX.
	ASH TT,-1	;DIVIDE BY 2. THIS IS THE NEW APPROX.
	MOVE TTT,TT	;GET APPROX.
	IDIVM T,TTT	;DIVIDE IT INTO THE SQUARE
	ADD TTT,TT	;ADD APPROX.
	ASH TTT,-1	;DIVIDE BY 2. THIS IS THE NEW APPROX.
	TRZE TFLG	;GONE  THROUGH TWICE?
	JRST SLOP1	;NO
	MOVE T,TTT
	POPJ P,
;PRINT CORESIZE, GET SCALE AND TELL BOX SIZE(D)
PCORE:	MOVE T,JOBREL
	SUB T,JOBFF
	LSH T,-12
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/ K CORE
/]
	POPJ P,
MD,{
GETSCL:	TRNE FLAG,%DOPLT
	OUTSTR[ASCIZ/PUT PEN BOTTOM CENTER.
/]
	SKIPE PARG
	JRST [	MOVEI TTT,1
		JRST GOTSCL]
	TRNE FLAG,PRODUCE
	JRST [	MOVEI TTT,2
		JRST GOTSCL]
ASK:	OUTSTR[ASCIZ/SCALE FACTOR?/]
	PUSHJ P,DECIN
	JRST [	PUSHJ P,IERR
		JRST ASK]
	JUMPN TTT,.+3
	MOVEI TTT,2		;MAKE CR-LF INTO SIZE 2
	OUTSTR[ASCIZ/USING SIZE 2!
/]
GOTSCL:	MOVEM TTT,SCALE
	SETZM %ROTIT		;ASSUME UPRIGHT
	MOVE T,LRGX
	SUB T,SMLX
	IMUL T,SCALE
	IMULI T,5
	TRNN FLAG,%DOPLT	;GOING TO CALCOMP?
	JRST .+3
	CAIL T,=28000
	JRST [	OUTSTR[ASCIZ/X TOO LARGE, ROTATING FOR CALCOMP!
/]
		SETOM %ROTIT
		JRST .+1]
	OUTSTR[ASCIZ/THAT'S /]
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ INCHES WIDE, AND /]
	MOVE T,LRGY
	SUB T,SMLY
	IMUL T,SCALE
	IMULI T,5
	TRNN FLAG,%DOPLT
	JRST WILFIT
	CAIL T,=28000
	SKIPN %ROTIT
	JRST WILFIT
	OUTSTR[ASCIZ/X AND Y BOTH TOO BIG FOR CALCOMP HORIZONTAL, LOSE BIG!
/]
	JRST ASK

WILFIT:	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ INCHES HIGH.
/]
	MOVE T,LRGX
	SUB T,SMLX
	MOVEM T,WIDTH
	MOVE T,LRGY
	SUB T,SMLY
	MOVEM T,HEIGHT
	SKIPE T,PARG
	JRST [	ADDI T,"A"-1
		OUTSTR[ASCIZ/USING BOX SIZE /]
		OUTCHR T
		OUTSTR[ASCIZ/
/]
		JRST BOXGOT]
	TRNE FLAG,PRODUCE
	JRST [	MOVEI T,"C"
		JRST BOXGOT]
	MOVE T,WIDTH
	IMUL T,SCALE
	MOVE TT,HEIGHT
	IMUL TT,SCALE
	CAIG T,AW
	CAILE TT,AH-=1000/5
	CAIA
	JRST [	OUTSTR[ASCIZ/SIZE A IS BIG ENOUGH!
/]
		JRST ASKSIZ]
	CAIG T,BW
	CAILE TT,BH-=1000/5
	CAIA
	JRST [	OUTSTR[ASCIZ/SIZE B IS BIG ENOUGH!
/]
		JRST ASKSIZ]
	CAIG T,CW
	CAILE TT,CH-=1000/5
	CAIA
	JRST [	OUTSTR[ASCIZ/SIZE C IS BIG ENOUGH!
/]
		JRST ASKSIZ]
	CAIG T,DW
	CAILE TT,DH-=1000/5
	CAIA
	JRST [	OUTSTR[ASCIZ/SIZE D IS BIG ENOUGH!
/]
		JRST ASKSIZ]
	OUTSTR[ASCIZ/NO SIZE IS BIG ENOUGH!
/]
;ASK BOX SIZE AND SETUP BOX INFO(D)
ASKSIZ:	OUTSTR[ASCIZ/A, B, C, OR D (OR SET:S OR FIT:F OR NONE:<CR>)?/]
	PUSHJ P,GETYES
	JFCL
BOXGOT:	SETZ E,
	CAIN T,12
	JRST NOBRDA
	CAIN T,"A"
	MOVE E,[AW,,AH]
	CAIN T,"B"
	MOVE E,[BW,,BH]
	CAIN T,"C"
	MOVE E,[CW,,CH]
	CAIN T,"D"
	JRST [	MOVE E,[DW,,DH]
		SKIPE %ROTIT		;ALREADY ROTATED?
		JRST NOBRDA
		SETOM %ROTIT
		OUTSTR[ASCIZ/ROTATING SIZE "D" FOR CALCOMP!
/]
		JRST NOBRDA]
	CAIN T,"F"
	JRST [	MOVE E,HEIGHT
		IMUL E,SCALE
		ADDI E,=2000/5		;HALF INCH AT TOP AND BOT + BOX
		MOVE T,WIDTH
		IMUL T,SCALE
		ADDI T,=1000/5
		CAIGE T,AW
		MOVEI T,AW
		HRL E,T
		JRST NOBRDA]
	CAIN T,"S"
	JRST [	OUTSTR[ASCIZ/BOX SIZE (X,Y IN INCHES "." OK)?/]
		PUSH P,%ROTIT
		PUSHJ P,MILIN
		CAIL TTT,AW		;MUST BE WIDE ENOUGH FOR BOX
		CAIE T,","
		JRST [BXERR:PUSHJ P,IERR
			POP P,%ROTIT
			OUTSTR[ASCIZ/INPUT ERROR!
/]
			JRST ASKSIZ]
		MOVS E,TTT
		CAILE TTT,=28000/5	;OVERFLOW IN X?
		PUSHJ P,[SKIPE %ROTIT
			POPJ P,
			SETOM %ROTIT
			OUTSTR[ASCIZ/ROTATING FOR THIS SIZE BOX!
/]
			POPJ P,]
		PUSHJ P,MILIN
		CAIE T,12
		JRST BXERR
		HRR E,TTT
		SKIPE %ROTIT
		CAIG TTT,=28000/5
		JRST [	POP P,(P)
			JRST NOBRDA]
		OUTSTR[ASCIZ/TOO BIG IN BOTH X AND Y!
/]
		POP P,%ROTIT
		JRST ASKSIZ]
	JUMPE E,ASKSIZ
NOBRDA:	MOVEM E,BRDPNT
	JUMPE E,NOBRDB
	OUTSTR[ASCIZ/DRAWN BY= /]
	SKIPE STR1
	JRST [	OUTSTR STR1+1
	XNSTR1:	OUTSTR[ASCIZ/
/]
		JRST NSTR1]
	TRNE FLAG,PRODUCE
	JRST XNSTR1
	MOVE A,[POINT 7,STR1+1]
	MOVEI D,4		;SIZE 4
	PUSHJ P,PLTSTR
	MOVEM B,STR1
NSTR1:	OUTSTR[ASCIZ/DRAWING TITLE, LINE 1= /]
	SKIPE STR2
	JRST [	OUTSTR STR2+1
	XNSTR2:	OUTSTR[ASCIZ/
/]
		JRST NSTR2]
	TRNE FLAG,PRODUCE
	JRST XNSTR2
	MOVE A,[POINT 7,STR2+1]
	MOVEI D,4		;SIZE 4
	PUSHJ P,PLTSTR
	MOVEM B,STR2
NSTR2:	OUTSTR[ASCIZ/DRAWING TITLE, LINE 2= /]
	SKIPE STR3
	JRST [	OUTSTR STR3+1
	XNSTR3:	OUTSTR[ASCIZ/
/]
		JRST NOBRDB]
	TRNE FLAG,PRODUCE
	JRST XNSTR3
	MOVE A,[POINT 7,STR3+1]
	MOVEI D,4		;SIZE 4
	PUSHJ P,PLTSTR
	MOVEM B,STR3
NOBRDB:	SKIPN E,BRDPNT
	JRST [	MOVE E,HEIGHT
		IMUL E,SCALE
		MOVE T,WIDTH
		IMUL T,SCALE
		HRL E,T
		JRST .+1]
	MOVE T,SMLY
	ADD T,LRGY
	IMUL T,SCALE
	SKIPE BRDPNT			;MAYBE NO BOX
	SUBI T,=1000/5
	SUBI T,(E)
	ASH T,-1
	MOVEM T,OFFSET
	MOVE T,LRGX
	ADD T,SMLX
	IMUL T,SCALE
	HLRZ TT,E
	ADD T,TT
	ASH T,-1
	HRLM T,OFFSET
	SKIPN %ROTIT
	JRST [	HRRE T,OFFSET
		SUBI T,=2000/5
		MOVE TT,LRGX
		ADD TT,SMLX
		ASH TT,-1
		IMUL TT,SCALE
		HRL T,TT
		JRST GTSTRT]
	SKIPE TT,BRDPNT
	JRST [	HLRE TTT,OFFSET
		HLRZ TT,TT
		SUBM TTT,TT
		HRRZ T,BRDPNT
		ASH T,-1
		ADD T,OFFSET
		SUBI TT,=2000/5
		HRL T,TT
		JRST GTSTRT]
	MOVE T,LRGY
	ADD T,SMLY
	ASH T,-1
	IMUL T,SCALE
	MOVE TT,MINX
	IMUL TT,SCALE
	SUBI TT,=2000/5
	HRL T,TT
GTSTRT:	MOVEM T,START
	MOVEM T,STOP			;ASSUME STOPPING THERE
	HRREM T,Y
	HLREM T,X
	PUSHJ P,UNFIX
	MOVEM T,CURSE
	TRNN FLAG,%DOPLT		;PLOTTING?
	POPJ P,				;NO, DON'T ASK
	TRNN FLAG,PRODUCE
	SKIPE PARG
	JRST STSTOP
	OUTSTR[ASCIZ/REPOSITION AT END PLOT?/]
	PUSHJ P,GETYES
	POPJ P,
STSTOP:	HRRZ T,BRDPNT
	JUMPN T,.+3
	MOVE T,HEIGHT
	IMUL T,SCALE
	ADD T,OFFSET
	TLZ T,1
	SKIPN %ROTIT
	JRST [	ADDI T,=5000/5
		HLL T,START		;STOP AT SAME X
		JRST GTSTOP]
	ADD T,[XWD =5000/5,0]
	HRR T,START			;SAME Y
GTSTOP:	MOVEM T,STOP
	POPJ P,

ASKSIG:	OUTSTR[ASCIZ/SIGNATURE /]
	SETZM SIGNAM		;NONE YET!
	PUSHJ P,SETSIG
	POPJ P,
	MOVE T,FILNAM
	MOVEM T,SIGNAM
	MOVE T,FILEXT
	MOVEM T,SIGEXT
	MOVE T,FILPPN
	MOVEM T,SIGPPN
	INIT SIG,0
	'DSK   '
	0
	HALT .-3
	LOOKUP SIG,FILNAM
	JRST [	SKIPE T,SIGPPN
		JRST NOSIGX
		DSKPPN T,
		CAMN T,['DATRPH']
		JRST NOSIGX
		MOVE T,['DATRPH']
		MOVEM T,SIGPPN
		MOVEM T,FILPPN
		JRST .-1
	NOSIGX:	OUTSTR[ASCIZ/CAN'T FIND IT!
/]
		RELEASE SIG,
		JRST ASKSIG]
	RELEASE SIG,
	POPJ P,
};MD
;PRINT MAX X,Y'S AND BIGPAD (PC)
MPC,{
PSIZE:	OUTSTR[ASCIZ/PUT PEN AT 0,0.
FROM FILE, MIN X= /]
	MOVE T,SMLX
	MOVE TT,XOFF
	PUSHJ P,POSOUT
	OUTSTR[ASCIZ/ MAX X= /]
	MOVE T,LRGX
	MOVE TT,XOFF
	PUSHJ P,POSOUT
	OUTSTR[ASCIZ/ MIN Y= /]
	MOVE T,SMLY
	MOVE TT,YOFF
	PUSHJ P,POSOUT
	OUTSTR[ASCIZ/ MAX Y= /]
	MOVE T,LRGY
	MOVE TT,YOFF
	PUSHJ P,POSOUT
	OUTSTR[ASCIZ/
/]
	MOVE T,LRGX
	SUB T,SMLX
	CAILE T,=30000*2/5
	OUTSTR[ASCIZ/THIS WILL OVERFLOW THE PLOTTER!!!!!!
/]
	SKIPGE T,BIGPAD
	POPJ P,
	OUTSTR[ASCIZ/BIGPAD = /]
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/
/]
	POPJ P,

POSOUT:	ASH T,-1
	IMUL T,SCALE
	ADD T,TT
	IMULI T,5
	JRST MILOUT
;SET CHARACTER SCALE(PC), ASK DRILL PLOT(PC), SETUP TRW OUTPUT
CHRSCL:	MOVEI T,=120*2/5	;HEIGHT OF SIZE 5 (DEFAULT FOR TITLE LINES
	MOVEM T,MTAB		;SET IT
	MOVEI C,1
	OUTSTR[ASCIZ/CHAR	"M"	 HEIGHT
SCALE	CODE	(IN MILS)
0	M50	  120
/]
CHRSC1:	MOVE T,C
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/	M5/]
	MOVE T,C
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/	  /]
	PUSHJ P,DECIN
	JRST CHRLOS
	MOVE T,TTT
	IDIVI T,5
	JUMPN TT,[OUTSTR[ASCIZ/MUST BE MULTIPLE OF 5 MILS!
/]
		JRST CHRSC1]
	LSH T,1
	MOVEM T,MTAB(C)
	TRNN FLAG,DOMAG		;TRW OUTPUT?
	JRST CHRSC2
	IDIVI T,6
	JUMPE TT,CHRSC2
	OUTSTR[ASCIZ/MUST BE MULTIPLE OF 15 MILS FOR TRW!!
/]
	JRST CHRSC1

CHRSC2:	CAIGE C,4		;DONE LAST?
	AOJA C,CHRSC1
	SETZM ANYTXT		;NO TEXT YET
	POPJ P,

CHRLOS:	PUSHJ P,IERR
	JRST CHRSC1

PSETUP:
	OUTSTR[ASCIZ/IS THIS A DRILL PLOT?/]
	PUSHJ P,GETYES
	CAIA
	TRO FLAG,TRWDRL
	TRNE FLAG,TRWDRL	;IF DRILL PLOT
	TRZ FLAG,PLANE		;TURN OFF PLANE BIT
	TRNE FLAG,PLANE		;IS IT AN INNER PLANE?
	OUTSTR[ASCIZ/THIS IS AN INNER PLANE.
/]
	TRNN FLAG,DOMAG		;DOING MAGTAPE?
	JRST CHKDRL		;NO ASK ABOUT DRILL TAPE
	INIT TRWCHN,10		;FULL WORD MODE
	'DSK   '
	XWD MAGBUF,0
	JRST [	OUTSTR[ASCIZ/CAN'T GET MTA0!
/]
		HALT .-3]
	MOVEI T,6		;6 BIT BYTES
	DPB T,[POINT 6,MAGBUF+1,11]
	MOVEI T,MAGBFR
	EXCH T,JOBFF
	OUTBUF TRWCHN,2
	MOVEM T,JOBFF
	OUTSTR[ASCIZ/TRW /]
	PUSHJ P,SETTRW
	JRST .-2
	ENTER TRWCHN,FILNAM
	JRST [	OUTSTR[ASCIZ/TRW ENTER FAILED!
/]
		HALT .+1]
;TRW MESSAGES(PC), DRILL TAPE SETUP(PC), RETICLE SELECT ROUTINE(PC)
	MOVEI T,TXTRET
	PUSHJ P,DORET		;SELECT TEXT RETICLE
	MOVEI T,=100		;UP AND OVER 1/2 INCH TO CLEAR FILM EDGE
	MOVEM T,X
	MOVEM T,Y
	PUSHJ P,MAGLNS		;INVISIBLE TO 1,1 INCHES
	MOVE TT,[POINT 7,[ASCIZ/***M50G58D10STANFORD A.I. FOONLY GROUP.  */]]
	PUSHJ P,MAGSTR
	OUTSTR[ASCIZ/OPERATOR MESSAGES, 40 CHARS PER LINE (MAX). END WITH BLANK LINE.
THESE WILL BE PLOTTED AT THE BOTTOM OF THE FILM AS WELL AS TYPED.
MESSAGES SHOULD NOT EXTEND PAST HERE..←
STANFORD A.I. FOONLY GROUP.	<ALREADY ON TAPE>
/]
DOMES:	PUSHJ P,GETMES
	JUMPE B,CHKDRL		;END WITH NULL STRING
	ADDI B,14		;14 OTHER CHARS
	CAML B,MAGBUF+2
	PUSHJ P,ENDREC
	MOVE TT,[POINT 7,[ASCIZ/M50G58D10/]]
	PUSHJ P,MAGSTR
	MOVE TT,[POINT 7,STRING]
	PUSHJ P,MAGSTR
	PUSHJ P,MGSTAR
	JRST DOMES
CHKDRL:	TRNN FLAG,TRWDRL	;ONLY DO DRILL TAPE IF DRILL PLOT ALREADY
	JRST NODRIL
	OUTSTR[ASCIZ %CINCH/VOSTRON/CIRCO DRILL TAPE?%]
	PUSHJ P,GETYES
	JRST NODRIL
	TRO FLAG,DOTAPE
	INIT TAP,10
	'DSK   '
	XWD TAPHD,0
	JRST [	OUTSTR[ASCIZ/CAN'T GET DISK!!!
/]
		HALT .-3]
	OUTSTR[ASCIZ/DRILL TAPE /]
TAPNAM:	PUSHJ P,SETDRL
	JRST .-1
	ENTER TAP,FILNAM
	JRST [	OUTSTR[ASCIZ/ENTER FAILED.
/]
		HALT TAPNAM]
	MOVEI T,TAPBUF
	EXCH T,JOBFF
	OUTBUF TAP,2
	MOVEM T,JOBFF
NODRIL:	MOVN T,XOFF
	IDIV T,SCALE
	ASH T,1
	HRLM T,CURSE
	MOVN T,YOFF
	IDIV T,SCALE
	ASH T,1
	HRRM T,CURSE
	POPJ P,

RETSEL:	HLRZ T,DOTXT
	XCT (T)[MOVEI T,LINRET
		HALT .+1
		MOVEI T,TXTRET
		HALT .+1
		JRST [	HRRZ T,DOTXT
			ADDI T,DONUT	;LEAVE OFFSET FOR STANDARD RETICLES
			JRST .+1]
		]
DORET:	CAMN T,LSTRET			;DIFFERENT FROM LAST?
	POPJ P,				;NO
	CAILE T,=24			;LARGEST LEGAL
	JRST [	OUTSTR[ASCIZ/I'M SORRY THE RETICLE YOU HAVE REQUESTED....
USING 24 INSTEAD OF /]
		PUSHJ P,DECOUT
		OUTSTR[ASCIZ/.
/]
		MOVEI T,=24
		JRST .+1]
	MOVEM T,LSTRET
	OUTSTR[ASCIZ/WHEEL POS = /]
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/ CODE = D/]
	MOVE T,LSTRET
	OUTSTR RETTAB-1(T)
	OUTCHR [40]
	CAILE T,=9
	JRST [	SUBI T,DONUT-1
		OUTSTR[ASCIZ/PAD TYPE /]
		PUSHJ P,DECOUT
		JRST .+2]
	OUTSTR @RETTXT-1(T)
	OUTSTR[ASCIZ/
/]
	TRNN FLAG,DOMAG			;REALLY DOING MAGTAPE?
	POPJ P,				;NO
	MOVE T,MAGBUF+2
	CAIG T,=14			;14 CHARS
	PUSHJ P,ENDREC
	MOVE TT,[POINT 7,[ASCIZ/G01D02*G54D/]]
	PUSHJ P,MAGSTR
	MOVE TT,LSTRET
	ADD TT,[POINT 7,RETTAB-1]
	JRST MAGSTR

DEFINE R(T)
{	ASCIZ/T/
}

RETTAB:
	R	10*
	R	11*
	R	12*
	R	13*
	R	14*
	R	15*
	R	16*
	R	17*
	R	18*
	R	19*
	R	70*
	R	71*
	R	20*
	R	21*
	R	22*
	R	23*
	R	24*
	R	25*
	R	26*
	R	27*
	R	28*
	R	29*
	R	72*
	R	73*

DEFINE R(T)
<	[ASCIZ/T/]
>
RETTXT:	R	LINES
	R	TEXT
	R	INNER PLANE EDGE
	R	FINGERS
	R	TARGETS
	R	DRILL DONUTS
	R	PADS
	R	CLEARANCES
	R	PIN 1 SQUARES		;9
};MPC
;SETUP FR80 OUTPUT
FRSET1:	INIT F80CHN,10
	'DSK   '
	XWD FRBUF,0
	JRST [	OUTSTR[ASCIZ/CAN'T GET DSK!
/]
		HALT FRSET1]
	MOVEI T,FRBFR
	EXCH T,JOBFF
	OUTBUF F80CHN,2
	MOVEM T,JOBFF
MD,{
	TRNE FLAG,PRODUCE
	JRST [	MOVE T,SAVNAM
		MOVEM T,FILNAM
		MOVSI T,'F80'
		MOVEM T,FILEXT
		SETZM FILDAT
		SETZM FILPPN
		JRST GOTFNM]
};MD
	OUTSTR[ASCIZ/FR80 /]
	PUSHJ P,SETF80
	JRST .-2
GOTFNM:	ENTER F80CHN,FILNAM
	JRST [	OUTSTR[ASCIZ/FR80 ENTER FAILED!
/]
		HALT .+1]
	MOVE T,[POINT 18,FRBFR+2,35]
	MOVEM T,FRBUF+1
	SETOM LSTROT		;ROTATION STARTS UNKNOWN
	MOVEI T,777777
	MOVEM T,LASTY
	MOVEM T,LASTX
	SETOM LSTSPC		;LAST SPACING
	MOVEI T,(<BYTE(3)2(6)6(2)0(4)0(3)0>)	;SPOT SIZE 0
	PUSHJ P,FROUT
	MOVEI T,(<BYTE(3)2(6)5(2)0(4)0(3)7>)	;INTENSITY 7
	JRST FROUT
;TOP LEVEL, CALL ALL THE SUBRS
R:	JRST @130		;RETURN FROM RAID

STRT:	MOVEI FLAG,%DOPLT
MPC,{
	SETZM CRDNUM
};MPC
	MOVE P,[XWD -200,PDL-1]
ITS,<	PUSHJ P,ITSGO>
	CALLI
	OUTSTR[ASCIZ/CALCOMP PLOT?/]
	PUSHJ P,GETYES
	TRZ FLAG,%DOPLT
MPC,{	SETZM %ROTIT
	TRNE FLAG,%DOPLT
	JRST [	OUTSTR[ASCIZ/ROTATE CALCOMP OUTPUT?/]
		PUSHJ P,GETYES
		JRST .+1
		SETOM %ROTIT
		JRST .+1]
	PUSHJ P,TRWSET			;TRW PLOT?	}
	PUSHJ P,FRSET			;FR80?
MPC,{
	PUSHJ P,GETSCL			;GET SCALE
	PUSHJ P,GETOFF			;AND OFFSET
};MPC
MD,{	PUSHJ P,ASKSIG			;ASK ABOUT SIG NOW!}
PCLOOP:	PUSHJ P,NAMSET			;GET DISK AND FILE NAME
MPC,{	PUSHJ P,CHRSCL	}
	PUSHJ P,MAIN		;READ FILE
MD,{
	HRRZS A
	LSH A,-1
	MOVEM A,PARG		;SAVE ARG FROM DRAWING PROG
};MD
MPC,{
	TRZE A,200000			;PC TELLING US IT IS?
	TRO FLAG,PLANE			;YES
	HRRZM A,CRDNUM			;SAVE CARD NUMBER(AND SIDE INDICATOR)
};MPC
	PUSHJ P,IN			;GET FINAL WORD
	CAILE A,MAXVER
	JRST [	MOVEI A,MAXVER
		OUTSTR[ASCIZ/VERSION # TOO LARGE, WILL USE LARGEST!
/]
		JRST .+1]
	MOVEM A,PVER			;THIS IS PVER
MD,{	XCT (A)[PUSHJ P,TITCLR		;JUST CLEAR
		PUSHJ P,DOTIT		;READ AND/OR CLEAR
		PUSHJ P,DOTITD]		;	"	+ DATE&TIME
	PUSHJ P,PCORE
	PUSHJ P,GETSCL		;GET SCALE AND BOX INFO
};MD
	CLOSE DAT,		;LET GO OF FILE
MPC,{	PUSHJ P,PSIZE
	MOVEI C,4
CHRSCX:	SKIPL MTAB(C)
	JRST CHRSCY
	OUTSTR[ASCIZ/I FLUSHED SOME SCALE /]
	MOVE T,C
	PUSHJ P,DECOUT
	OUTSTR[ASCIZ/ TEXT!
/]
CHRSCY:	SOJGE C,CHRSCX
	SETOM LSTRET	;CLEAR LAST RETICLE
	PUSHJ P,PSETUP
};MPC
	TRNE FLAG,FR80
	PUSHJ P,FRSET1	;INITIALIZE FR80 STUFF
	TRZ FLAG,RSTENB	;NO RESTART ENABLE YET
	SETZM ROTIT
	TRNN FLAG,%DOPLT
	JRST NOPTP
GETPTP:	JSA 16,PLOTS
	JUMP THING1
	SKIPE THING1
	JRST [OUTSTR [ASCIZ /PLOTTER NOT AVAIL.
/]
		HALT GETPTP]
MD,{
	MOVE 1,START	;GET STARTING POS.
	JSA 16,SETXY	;SET PLOTTER THERE
};MD
	SKIPE %ROTIT
	SETOM ROTIT	;TELL PLOTS
	TRNE FLAG,MPC,{DOMAG!DOTAPE!}FR80!IREAD	;THIS IO WOULD GET BLOWN
	JRST NOPTP
	OUTSTR[ASCIZ/NUMBER OF LINES OR TEXT STRINGS
BETWEEN SAVES (0 DISABLES SAVING)?/]
	PUSHJ P,DECIN
	JRST [	OUTSTR[ASCIZ/ILLEGAL NUMBER!
/]
		PUSHJ P,IERR
		JRST .-2]
	JUMPE TTT,NOPTP
	MOVEM TTT,RSTSET
	SETZM RSTCNT
	TRO FLAG,RSTENB
	CALLI T,30		;GET JOB NUMBER
	DPB T,[POINT 3,SWAP+1,35]
	LSH T,-3
	DPB T,[POINT 3,SWAP+1,29]
MD,{	MOVE T,START	}
MPC,{	SETZ T,		}
	SKIPE %ROTIT
	JRST [	ADD T,[XWD =1250/5,0]
		JRST .+2]
	ADDI T,=1250/5
	TLZ T,1
	HRREM T,Y
	HLREM T,X
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [2]
	MOVNI T,=250/5
	ADDM T,X
	SKIPE %ROTIT
	MOVN T,T
	ADDM T,Y
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [3]
	SKIPE %ROTIT
	JRST [	MOVNI T,=500/5
		ADDM T,Y
		JRST .+3]
	MOVEI T,=500/5
	ADDM T,X
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [2]
NOPTP:
	PUSHJ P,FSTINI
MPC,{	MOVSI T,400000	;VERY SMALL NUMBER
	MOVEM T,LRGX
	MOVEM T,LRGY
	HRLOI T,377777	;VERY LARGE NUMBER
	MOVEM T,SMLX
	MOVEM T,SMLY
	SKIPGE T,BIGPAD	;ANY PADS OR DRILL HOLES?
	JRST BEGTXT
	TRNE FLAG,TRWDRL;TRW DRILL PLOT ONLY?
	SETZ T,		;YES, START WITH DRILL HOLES
	HRLI T,4	;PAD AND DRILL HOLE CODE
	MOVEM T,DOTXT
	TRNE FLAG,TRWDRL!DOTAPE!DOMAG
	JRST PLOP0
	OUTSTR[ASCIZ/SKIP PLOTTING OF ALL PADS?/]
	PUSHJ P,GETYES
	JRST PLOP0
BEGTXT:	SKIPE T,ANYTXT	;DOING TEXT?
	MOVSI T,2	;YES, TEXT CODE
	MOVEM T,DOTXT
};MPC
PLOP0:	PUSHJ P,SORT	;SORT BY DOTXT
;MAIN LOOP, PLOT LINES, TEXT, ETC.
PLOP:	SOSN RSTCNT	;TIME TO SAVE YET?
	PUSHJ P,SAVE
	PUSHJ P,CLFND	;FIND CLOSEST THING TO WHERE WE ARE
	JUMPE A,OUTDON	;DONE?
MPC,{
	PUSHJ P,RETSEL	;YES, SETUP RETICLE
};MPC
	MOVE B,A	;CALC TABLE 2 POINTER...
	SUB A,T2S
	ADD A,T1S	;......
	HRRZ C,(B)	;GET TABLE 3 POINTER
	HLRZ D,(B)	;GET TYPE BITS
	JRST @(D)[OUTLS
		OUTLE
		OUTTXT
		.	;THIS IS AN ERROR
		OUTTXT]
MPC,{
OUTDON:
	HLRZ T,DOTXT
	XCT FINTAB(T)

FINTAB:	JRST OUTDN1
	HALT TDONE
	JRST TDONE
	HALT PDONE
	JRST PDONE

TDONE:	SETZM DOTXT
	TRNN FLAG,TRWDRL	;JUST DRILL PLOT?
	JRST PLOP0		;LOOP TO RETICLE SELECT
	JRST OUTDN1

PDONE:	SOS T,DOTXT
	TLNE T,4
	JRST [	TRNN FLAG,TRWDRL
		JRST [	TRNE T,-1
			JRST PLOP0
			TRNN FLAG,DOTAPE
			JRST PDONE
			MOVEI T,DONUT	;PBASE MUST BE DONUT PAD FOR DRILL PLOT!
			MOVEM T,LSTRET	;INHIBIT RETICLE SELECT
			JRST PLOP0]
		TRNE T,-1
		JRST PDONE
		JRST PLOP0]
	TRNN FLAG,DOTAPE
	JRST PDONE1
	MOVEI T,=30
	MOVEI TTT,=12		;X,Y ZERO, FOLLOWED BY =30
	PUSHJ P,FIVDEC
	MOVEI T,200
	PUSHJ P,PTAPE
	OUTSTR[ASCIZ/DRILL TAPE FILE COMPLETE, BUT MUST BE PROCESSED BY TD!
/]
	RELEASE TAP,		;CLOSE TAPE CHANNEL
	TRZ FLAG,DOTAPE		;MAKE SURE IT'S DONE
PDONE1:	SKIPN ANYTXT
	JRST TDONE		;TEXT DONE INSTANTLY IF NOT DOING IT
	MOVSI T,2
	MOVEM T,DOTXT
	JRST PLOP0

OUTDN1:	PUSHJ P,FORCE		;FINISH CURRENT STUFF AND RAISE PEN
	SKIPE E,CRDNUM		;DID HE WANT A CARD?
	JRST GOTCRD
	JRST CRDN
};MPC
;LINES
OUTLS:	HRRZ E,1(B)	;GET POINTER TO END OF LINE
	MOVEI TTT,1	;INCREMENT
	JRST DOLINE
OUTLE:	HRRZ E,-1(B)	;GET POINTER TO START OF LINE
	MOVNI TTT,1	;INCREMENT
DOLINE:	MOVE T,(C)	;GET X,Y
	CAMN T,CURSE	;ARE WE THERE?
	TRNN FLAG,IKNOW	;DO WE REALLY KNOW WHERE WE ARE?
	CAIA		;NO
	JRST WETHER	;YES
	PUSHJ P,FIXXY	;NO, GET X AND Y
	PUSH P,TTT
	TRNE FLAG,FR80
	PUSHJ P,FRLNS	;INVISIBLE
MPC,{	TRNE FLAG,DOMAG	;DO MAG TAPE?
	PUSHJ P,MAGLNS	;YES, START LINE
};MPC
	POP P,TTT
	TRNN FLAG,%DOPLT
	JRST WETHER
	JSA 16,PLOT	;MOVE TO STARTING POSITION
	JUMP X
	JUMP Y
	JUMP [3]	;PEN UP
WETHER:	ADD C,TTT	;GO TO NEXT LINE
	MOVE T,(C)	;GET X,Y
	PUSHJ P,FIXXY	;GET X AND Y
	PUSH P,TTT
	TRNE FLAG,FR80
	PUSHJ P,FRLIN
MPC,{	TRNE FLAG,DOMAG
	PUSHJ P,MAGLIN
};MPC
	POP P,TTT
	TRNN FLAG,%DOPLT
	JRST NOPLT1
	JSA 16,PLOT	;PLOT IT
	JUMP X
	JUMP Y
	JUMP [2]	;PEN DOWN
NOPLT1:	CAME C,E	;DONE?
	JRST WETHER	;NO
	MOVE T,(C)	;YES, GET LAST X,Y
	MOVEM T,CURSE	;DEPOSIT AS CURRENT X,Y
	TRO FLAG,IKNOW	;NOW WE KNOW WHERE WE ARE
	JRST PLOP	;LOOP
;TEXT
OUTTXT:
	HLRZ T,(C)	;GET CODE
	LSH T,-1
	XCT (T)TDIS
	MOVE T,(A)	;GET X,Y
	PUSHJ P,FIXXY	;GET X AND Y
	MOVE T,(C)	;GET SIZE
	LSH T,-1
	SETZM ANGLE	;ASSUME HORZ
	TRZE T,200000	;VERT MAYBE?
	AOS ANGLE	;YES
MPC,{	LSH T,-3
	MOVEM T,CSIZ
	MOVE T,MTAB(T)	;GET HEIGHT (SPACING)
};MPC
MD,{	IMUL T,SCALE	;	"	}
	MOVEM T,CSIZZ
MD,{	ASH T,-1
	ADDM T,Y	;OFFSET Y BY THIS (4*SIZE)
	MOVE T,(C)	;GET SIZE AGAIN
	TRNN T,400000	;VERT TEXT?
	SKIPA T,CSIZZ	;NO, POS
	MOVN T,CSIZZ	;YES, NEG
	ASH T,-1
	ADDM T,X	;OFFSET X BY THIS (4*SIZE)
};MD
	ADDI C,1
	HRRM C,TTPNT	;DEPOSIT TEXT POINTER
	MOVEI TT,FRTXT1	;POINTER TO TEXT WE ARE GOING TO DO
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
MPC,{	TRNE FLAG,DOMAG
	PUSHJ P,MAGTXT
};MPC
	TRNN FLAG,%DOPLT
	JRST TXTDN1
	JSA 16,SYMBOL	;PLOT THE TEXT
FRTXT1:	JUMP X
	JUMP Y
	JUMP CSIZZ	;SIZE
	JUMP ANGLE
TTPNT:	JUMP 0		;TEXT POINTER
	JUMP [XWD 5,5]	;TYPE (UNTIL NULL)
TXTDN1:	MOVE T,1(A)	;APPROX END OF TEXT
	MOVEM T,CURSE
	TRZ FLAG,IKNOW	;FLAG THAT WE DON'T KNOW WHERE WE ARE!
	JRST PLOP

PADDN1:	TRZ FLAG,IKNOW
PADDN2:	JRST PLOP	;LOOP

TDIS:	JFCL		;FALL THROUGH FOR TEXT
MD,{	JRST DIAMOND	}
MPC,{	JRST HOLE
	JRST PAD	}
;FIX X,Y'S
FIXXY:	PUSH P,T
	HLRE TT,T	;GET X
	HRRES T		;GET Y
MPC,{	ASH TT,-1	}
	IMUL TT,SCALE
MPC,{	ADD TT,XOFF	}
MPC,{	ASH T,-1	}
	IMUL T,SCALE
MPC,{	ADD T,YOFF	}
	MOVEM T,Y
	CAMGE T,SMLY
	MOVEM T,SMLY
	CAMLE T,LRGY
	MOVEM T,LRGY
	MOVEM TT,X
	CAMGE TT,SMLX
	MOVEM TT,SMLX
	CAMLE TT,LRGX
	MOVEM TT,LRGX
	POP P,T
	POPJ P,
UNFIX:	MOVE T,X	;GET X
MPC,{	SUB T,XOFF	}
	IDIV T,SCALE	;ADJUST
MD,{	TRZ T,1		}
MPC,{	ASH T,1		}
	MOVEM T,1(P)		;STUFF AWAY HERE TEMPORARILY
	MOVE T,Y
MPC,{	SUB T,YOFF	}
	IDIV T,SCALE
MD,{	TRZ T,1		}
MPC,{	ASH T,1		}
	HRL T,1(P)
	POPJ P,
;PAD SIMULATION TABLES
MPC,{
DEFINE XY(X,Y)
{	XWD <X>/5*2,<Y>/5*2	}
RADIX =10
XTAB:	XY	0,-20
	XY	0,20
	XY	0,0
	XY	20,0
	XY	-20,0
XLEN←←.-XTAB

PADTAB:	
	XY	-5,-25
	XY	-20,-20
	XY	-25,-5
	XY	-25,5
	XY	-20,20
	XY	-5,25
	XY	5,25
	XY	20,20
	XY	25,5
	XY	25,-5
	XY	20,-20
	XY	5,-25
	XY	-5,-25
PADLEN←←.-PADTAB

CLRTAB:
	XY	10,-35
	XY	20,-30
	XY	30,-20
	XY	35,-10
	XY	35,10
	XY	30,20
	XY	20,30
	XY	10,35
	XY	-10,35
	XY	-20,30
	XY	-30,20
	XY	-35,10
	XY	-35,-10
	XY	-30,-20
	XY	-20,-30
	XY	-10,-35
	XY	10,-35
CLRLEN←←.-CLRTAB

SQRTAB:
	XY	25,25
	XY	25,-25
	XY	-25,-25
	XY	-25,25
	XY	25,25
SQRLEN←←.-SQRTAB

TGTAB:	XY	-20,-90
	XY	-50,-80
	XY	-80,-50
	XY	-90,-20
	XY	-90,20
	XY	-80,50
	XY	-50,80
	XY	-20,90
	XY	20,90
	XY	50,80
	XY	80,50
	XY	90,20
	XY	90,-20
	XY	80,-50
	XY	50,-80
	XY	20,-90
	XY	-20,-90
	XY	-20,-60
	XY	-40,-50
	XY	-50,-40
	XY	-60,-20
	XY	-60,20
	XY	-50,40
	XY	-40,50
	XY	-20,60
	XY	20,60
	XY	40,50
	XY	50,40
	XY	60,20
	XY	60,-20
	XY	50,-40
	XY	40,-50
	XY	20,-60
	XY	-20,-60
	XY	-10,-30
	XY	-30,-10
	XY	-30,10
	XY	-10,30
	XY	10,30
	XY	30,10
	XY	30,-10
	XY	10,-30
	XY	-10,-30
	XY	0,-5
	XY	-5,0
	XY	0,5
	XY	5,0
	XY	0,0
TGLEN←←.-TGTAB
RADIX 8
;DO PADS AND DRILL HOLES(PC)
PAD:	HRRZ T,(C)
	LSH T,-1
	MOVEM T,PADNUM
	MOVE T,(A)
	MOVEM T,CURSE
	PUSHJ P,DOPAD
	JRST PADDN1

HOLE:	SETZM PADNUM
	MOVE T,(A)
	MOVEM T,CURSE
	PUSHJ P,DOHOLE
	JRST PADDN1

DOHOLE:	TRNN FLAG,DOTAPE
	JRST QQTAPE
	MOVE T,CURSE
	PUSHJ P,FIXXY
	MOVE T,Y		;INVERT BY INTERCHANGING X AND Y.
	IMULI T,5
	MOVEI TTT,5
	PUSHJ P,[FIVDEC:IDIVI T,=10
			HRLM TT,(P)
			SOJLE TTT,FIVDC1
			PUSHJ P,FIVDEC
		FIVDC1:	HLRZ T,(P)
			MOVE T,(T)[	40
					1
					2
					23
					4
					25
					26
					7
					10
					31]
			JRST PTAPE]
	MOVE T,X
	IMULI T,5
	MOVEI TTT,5
	PUSHJ P,FIVDEC
	MOVEI T,40
	PUSHJ P,PTAPE	;MACHINE FUNCTION
	MOVEI T,1
	PUSHJ P,PTAPE	;DRILL SIZE
	MOVEI T,200
	PUSHJ P,PTAPE	;END OF BLOCK
QQTAPE:	TRNN FLAG,TRWDRL	;FAKING UP A DRILL PLOT FOR TRW
	POPJ P,			;NO, ALL DONE
DOPAD:	TRNE FLAG,DOMAG
	PUSHJ P,MAGPAD
	MOVE E,PADNUM
	CAIL E,MXPLEN		;LEGAL FOR TABLE
	MOVEI E,MXPLEN-1	;NO, USE LAST ENTRY
	MOVE E,PTAB(E)
STRTPD:	MOVEI D,3	;FIRST MOVE INVISIBLE
PUTPAD:	MOVE T,(E)
	ADD T,CURSE
	TLZ T,1
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	MOVEI D,2
	AOBJN E,PUTPAD
	POPJ P,

TARGET:	MOVEI C,[0]
	TRNE FLAG,DOMAG
	PUSHJ P,MAGPAD		;SAME AS PAD'S (JUST FLASH COMMAND)
	MOVE E,[XWD -TGLEN,TGTAB]
	JRST STRTPD

PTAB:	XWD -XLEN,XTAB
	XWD -PADLEN,PADTAB
	XWD -CLRLEN,CLRTAB
	XWD -SQRLEN,SQRTAB
	XWD -PADLEN,PADTAB	;JUST LOTS OF THESE FOR NOW
MXPLEN←←.-PTAB
>
;DO DIAMONDS(D)
MD,{
DIAMOND:MOVE C,(A)
	MOVE T,C
	EXCH C,CURSE
	PUSHJ P,FIXXY
	HRR T,Y
	HRL T,X
	MOVEM T,DIALOC
	MOVE E,[XWD -DIALEN,DIATAB]
	MOVEI D,2
	CAMN E,CURSE
	TRNN FLAG,IKNOW		;DO WE REALLY KNOW WHERE WE ARE
	CAIA
	JRST DIAPLT
	TRNE FLAG,FR80
	PUSHJ P,FRLNS
	TRNN FLAG,%DOPLT
	JRST DIAPLT
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [3]
DIAPLT:	MOVE T,(E)
	ADD T,DIALOC
	HRREM T,Y
	HLREM T,X
	PUSHJ P,PLOTIT
	AOBJN E,DIAPLT
	JRST PADDN1

DIATAB:	XWD 5,0
	XWD 0,5
	XWD -5,0
	XWD 0,-5
	XWD 5,0
	XWD 0,0
DIALEN←←.-DIATAB

};MD
FORCE:	TRNN FLAG,%DOPLT
	POPJ P,
	JSA 16,WHERE
	JUMP X
	JUMP Y
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [3]
	CLOSE 17,	;FORCE COMPLETION
	CALLI 17,10	;WAIT FOR IT TO FINISH
	POPJ P,

PLOTIT:	TRNE FLAG,FR80
	PUSHJ P,FRLINS
PLOTIA:	TRNN FLAG,%DOPLT
	POPJ P,
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP D
	POPJ P,
;PC CARD (PC)
MPC,{
CRDN:	PUSHJ P,FORCE		;FINISH CURRENT BUSINESS
	OUTSTR[ASCIZ/CARD NUMBER?/]
	PUSHJ P,DECIN
	JRST [	PUSHJ P,IERR
		JRST CRDN]
	JUMPE TTT,NOCARD
	MOVE E,TTT
	LSH E,1			;ACCOUNT FOR SHIFT LATER
GOTCRD:	HLLZS CRDNAM+1
	SETZM CRDNAM+2
	MOVE T,['DATRPH']
	MOVEM T,CRDNAM+3
	LOOKUP 5,CRDNAM
	JRST [	OUTSTR[ASCIZ/CAN'T FIND CARD.TAB!
/]
		HALT NOCARD]
	MOVEI D,3
	TRZ E,400000		;CLEAR SIDE INDICATOR
	LSH E,-1		;COMPENSATE FOR OFFSET
CRDLOP:	SOJLE E,CRDFND
	PUSHJ P,IN
	CAIN A,400000
	JRST [	OUTSTR[ASCIZ/NO SUCH CARD!
/]
		JRST CRDN]
	PUSHJ P,IN
	CAIE A,400000
	JRST .-2
	JRST CRDLOP
CRDFND:	MOVE T,T3S
	MOVEM T,T3P
	SETZ F,
CRDFN4:	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	JRST CRDFN3
	MOVE T,T3P
	CAMG T,JOBREL
	JRST CRDFOK
	CALLI T,11
	JRST 4,.-4
CRDFOK:	ADD F,A
	TLZ F,1
	MOVEM A,@T3P
	AOS T3P
	JRST CRDFN4
CRDFN3:	MOVEM A,@T3P
	MOVE T,T3P
	SUB T,T3S	;NUMBER OF ENTRIES
	HRRE TT,F
	IDIV TT,T
	HRRM TT,CENTER
	HLRE TT,F
	IDIV TT,T
	HRLM TT,CENTER
CRDLP1:	MOVE A,@T3S
	CAMN A,[(400000)]
	JRST CRDFNG
	CAIN A,400000
	JRST NOCARD
	TRNE FLAG,PLANE	;INNER PLANE?
	SKIPA T,[IPBRET]		;WIDE SWATCH
	MOVEI T,LINRET
	PUSHJ P,DORET
	MOVE T,A
	TRNE FLAG,PLANE	;FUDGE IF OUTER PLANE
	JRST NOPLAN
	MOVE TT,A
	TLO TT,1
	SUB TT,CENTER
BFUDGE←←5		;FUDGE BY 5 MILS
	MOVE TTT,[XY	BFUDGE,BFUDGE]
	TLNE TT,400000		;X NEGATIVE?
	HRLI TTT,-=BFUDGE/5*2
	TRNE TT,400000
	HRRI TTT,-=BFUDGE/5*2
	ADD T,TTT
	TLZ T,1
NOPLAN:	TRZE T,1
	MOVEI D,3
	PUSHJ P,FIXXY
	TRNN FLAG,DOMAG
	JRST NNMAG
	CAIN D,3
	JRST [	PUSHJ P,MAGLNS
		JRST .+2]
	PUSHJ P,MAGLIN
NNMAG:	PUSHJ P,PLOTIT
	MOVEI D,2
	AOS T3S
	JRST CRDLP1
;CARD FINGERS, SHORTING BARS, TARGETS(PC)
CRDFNG:	TRNN FLAG,TRWDRL	;THIS GUY ONLY DOES DRILL HOLES, SKIP FINGERS
	TRNE FLAG,PLANE	;INNER PLANE
	JRST [	PUSHJ P,CSKIP		;SKIP FRONT FINGERS
		PUSHJ P,CSKIP		;SKIP BACK FINGERS
		PUSHJ P,CSKIP		;SKIP FRONT SHORTING BARS
		PUSHJ P,CSKIP		;SKIP BACK SHORTING BARS
		JRST DOTAR2]		;GO DO TARGETS!
	MOVE T,CRDNUM
	TRNN T,400000
	PUSHJ P,CSKIP		;SKIP OVER FRONT SIDE
	PUSHJ P,CRDFN1
	PUSHJ P,CSKIP		;SKIP BACK SIDE OR FRONT SHORTING BARS
DONIT:	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	JRST DOTARG
	MOVE C,A
	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	JRST DOTARG
	MOVE B,A
	PUSHJ P,SHORT
	JRST DONIT

DOTARG:	MOVE T,CRDNUM
	TRNE T,400000		;DO WE STILL HAVE TO SKIP SOME SHORTING BARS?
	PUSHJ P,CSKIP		;YES
DOTAR2:	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	JRST NOCARD		;NO TARGETS!
	CAIA			;SKIP CALL TO IN
DOTAR1:	PUSHJ P,IN
DOTAR3:	CAME A,[(400000)]
	CAIN A,400000
	JRST NOCARD
	MOVEM A,CURSE
	MOVEI T,TARRET
	PUSHJ P,DORET
	PUSHJ P,TARGET
	JRST DOTAR1

CRDFN1:	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	POPJ P,
	MOVE C,A
	PUSHJ P,IN
	CAME [(400000)]
	CAIN A,400000
	POPJ P,
	MOVE B,A
	PUSH P,A
	PUSHJ P,IN		;READ PIN# AND CONNECTOR ID AND IGNORE!
	POP P,A
	PUSHJ P,SHORT
	JRST CRDFN1

CSKIP:	PUSHJ P,IN
	CAME A,[(400000)]
	CAIN A,400000
	POPJ P,
	JRST CSKIP

SHORT:	MOVEI T,FNGRET
	PUSHJ P,DORET
	TRNN FLAG,DOMAG
	JRST XXXMAG
	MOVE T,C
	PUSHJ P,FIXXY
	PUSHJ P,MAGLNS
	MOVE T,B
	PUSHJ P,FIXXY
	PUSHJ P,MAGLIN
XXXMAG:	TLO A,1
	SUB A,C
	TDZ A,[(1)1]
	MOVEI E,0
	MOVEI F,2
	TLNE A,400000
	MOVEI E,1
	TRNE A,400000
	MOVEI F,3
	HLRE TT,A
	MOVMS TT
	HRRE T,A
	MOVMS T
	CAML TT,T
	MOVE F,E
	JRST @(F)[	FRIGHT
			FLEFT
			FUP
			FDOWN]
;CHEATING BOX FOR LINE
DEFINE XYZ(X,Y)
{	RADIX =10
	ADD T,[XY X,Y]
	TDZ T,[(1)1]
	RADIX =8
}
FRIGHT:	MOVE T,C
	XYZ	-FWIDTH,FWIDTH
	PUSHJ P,AIVECT
	MOVE T,C
	XYZ	-FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	-FWIDTH,FWIDTH
	JRST AVECT
FLEFT:	MOVE T,B
	XYZ	-FWIDTH,FWIDTH
	PUSHJ P,AIVECT
	MOVE T,B
	XYZ	-FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	-FWIDTH,FWIDTH
	JRST AVECT
FUP:	MOVE T,C
	XYZ	-FWIDTH,-FWIDTH
	PUSHJ P,AIVECT
	MOVE T,C
	XYZ	FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	-FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	-FWIDTH,-FWIDTH
	JRST AVECT
FDOWN:	MOVE T,B
	XYZ	-FWIDTH,-FWIDTH
	PUSHJ P,AIVECT
	MOVE T,B
	XYZ	FWIDTH,-FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,C
	XYZ	-FWIDTH,FWIDTH
	PUSHJ P,AVECT
	MOVE T,B
	XYZ	-FWIDTH,-FWIDTH
	JRST AVECT

AIVECT:	PUSHJ P,FIXXY
	MOVEI D,3
	JRST PLOTIT

AVECT:	PUSHJ P,FIXXY
	MOVEI D,2
	JRST PLOTIT

NOCARD:
};MPC
;BOX SUBR(D)
MD,{
OUTDON:
	PUSHJ P,FORCE
	SKIPN BRDPNT
	JRST NOBRD
	OUTSTR[ASCIZ/DOING BOX!
/]
	MOVEI T,1
	MOVEM T,SCALE
	MOVE T,OFFSET
	MOVEI D,3
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	HLLZ T,BRDPNT
	MOVN T,T
	ADD T,OFFSET
	TLZ T,1
	MOVEI D,2
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	HLLZ T,BRDPNT
	MOVN T,T
	ADD T,OFFSET
	HRRZ TT,BRDPNT
	ADD T,TT
	TLZ T,1
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	HRRZ T,BRDPNT
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	MOVE E,[XWD -BOXLEN,BOXTAB]
BRDLOP:	MOVE T,(E)
	MOVEI D,2
	TRZE T,1
	MOVEI D,3	;REALLY INVISIBLE
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	PUSHJ P,PLOTIT
	AOBJN E,BRDLOP
	MOVE T,(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI TT,FRTXT2
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
	TRNN FLAG,%DOPLT
	JRST NOPLT2
	JSA 16,SYMBOL
FRTXT2:	JUMP X
	JUMP Y
	JUMP [40]
	JUMP [0]	;ANGLE
	JUMP [ASCIZ/STANFORD ARTIFICIAL/]
	JUMP [XWD 5,5]	;END ON NULL
NOPLT2:	MOVE T,1(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI TT,FRTXT3
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
	TRNN FLAG,%DOPLT
	JRST NOPLT3
	JSA 16,SYMBOL
FRTXT3:	JUMP X
	JUMP Y
	JUMP [40]
	JUMP [0]
	JUMP [ASCIZ/INTELLIGENCE PROJECT/]
	JUMP [XWD 5,5]
NOPLT3:	MOVE T,2(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI T,STR2+1
	HRRM T,STRPNT
	MOVE B,STR2
	MOVEI D,40		;SIZE 4
	PUSHJ P,STRDON
;MORE BOX SUBR(D)
	MOVE T,3(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI T,STR3+1
	HRRM T,STRPNT
	MOVE B,STR3
	PUSHJ P,STRDON
	MOVE A,[POINT 7,STR0]
	MOVEI B,3		;NUM CHARS PUT OUT BY SIXLOP
	MOVE T,11(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVE TT,SAVNAM
	PUSHJ P,[SIXLOP:SETZ T,
			LSHC T,6
			JUMPE T,SIXLP1
			ADDI T,40
			IDPB T,A
			ADDI B,1
		SIXLP1:	JUMPN TT,SIXLOP
			POPJ P,]
	MOVEI T,"."
	SKIPN TT,SAVEXT
	JRST NOPEXT
	IDPB T,A
	ADDI B,1
	PUSHJ P,SIXLOP
NOPEXT:	MOVEI T,"["
	IDPB T,A
	SKIPN TT,SAVPPN
	DSKPPN TT,
	HLLZS TT
	PUSHJ P,SIXLOP
	MOVEI T,","
	IDPB T,A
	SKIPN TT,SAVPPN
	DSKPPN TT,
	HRLZS TT
	PUSHJ P,SIXLOP
	MOVEI T,"]"
	IDPB T,A
	MOVEI T,0
	IDPB T,A		;END WITH NULL
	MOVEI D,30
	CAILE B,=16
	MOVEI D,22
	MOVEI B,0
	MOVEI T,STR0
	HRRM T,STRPNT
	PUSHJ P,STRDON
	MOVE A,[POINT 7,STR0]
	MOVE T,4(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	LDB T,[POINT 12,DRWDAT,35]
	IDIVI T,=31
	ADDI TT,1
	IDIVI TT,=10
	ADDI TT,60
	IDPB TT,A
	ADDI TTT,60
	IDPB TTT,A
	MOVEI TT,"-"
	IDPB TT,A
	IDIVI T,=12
	LDB TTT,[POINT 7,MONTAB(TT),6]
	IDPB TTT,A
	LDB TTT,[POINT 7,MONTAB(TT),13]
	IDPB TTT,A
	LDB TTT,[POINT 7,MONTAB(TT),20]
	IDPB TTT,A
	MOVEI TT,"-"
	IDPB TT,A
	ADDI T,=64
	IDIVI T,=10
	ADDI T,60
	IDPB T,A
	ADDI TT,60
	IDPB TT,A
	MOVEI TT,0
	IDPB TT,A
	MOVEI B,0
	MOVEI D,30
	MOVEI T,STR0
	HRRM T,STRPNT
	PUSHJ P,STRDON
;MORE BOX SUBR(D)
	MOVE T,5(E)	;APPROVED BY
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI TT,FRTXT5
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
	TRNN FLAG,%DOPLT
	JRST NOPLT5
	JSA 16,SYMBOL
FRTXT5:	JUMP X
	JUMP Y
	JUMP [14]
	JUMP [0]
	JUMP [ASCIZ/APPROVED BY:/]
	JUMP [XWD 5,5]
NOPLT5:	MOVE T,6(E)	;DRAWN BY
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI TT,FRTXT6
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
	TRNN FLAG,%DOPLT
	JRST NOPLT6
	JSA 16,SYMBOL
FRTXT6:	JUMP X
	JUMP Y
	JUMP [14]
	JUMP [0]
	JUMP [ASCIZ/DRAWN BY:/]
	JUMP [XWD 5,5]
NOPLT6:	MOVE T,7(E)
	ADD T,OFFSET
	TLZ T,1
	PUSHJ P,FIXXY
	MOVEI D,40
	MOVEI T,STR1+1
	HRRM T,STRPNT
	MOVE B,STR1
	PUSHJ P,STRDON
;SIGNATURE(D)
DOSIG:	SKIPN SIGNAM
	JRST NOBRD
	INIT DAT,10
	SIXBIT /DSK/
	PZE INBUF
	JRST [OUTSTR [ASCIZ /DSK NOT AVAIL -- WHAT THE FUCK?/]
		HALT NAMSET]
	MOVEI TT,IBUF
	EXCH TT,JOBFF
	INBUF DAT,2
	MOVEM TT,JOBFF
	MOVE T,SIGNAM
	MOVEM T,FILNAM
DOSIG1:	MOVE T,SIGEXT
	HLLZM T,FILEXT
	MOVE T,SIGPPN
	MOVEM T,FILPPN
	SETZM FILEXT+1
	LOOKUP DAT,FILNAM
	JRST [	OUTSTR[ASCIZ/CAN'T FIND SIGNATURE FILE!
/]
		PUSHJ P,ASKSIG		;ASK HIM AGAIN
		JRST DOSIG1]
	MOVE T,T3S
	MOVEM T,T2S
	MOVEM T,T2P
	SUB T,JOBREL		;CALC DIST FROM HERE TO TOP OF CORE
	ASH T,-1		;HALF IT
	ADD T,JOBREL		;NOW HALFWAY FROM T2S TO JOBREL
	MOVEM T,T1S
	MOVEM T,T1P
	PUSH P,E		;SAVE E
SIGLP1:	PUSHJ P,IN
	HLRZ T,A
	CAIN T,400001
	JRST SIGLP2
	MOVE T,A
	PUSHJ P,PUT1		;USE TABLE 1 FOR SIGNATURE X,Y
	TRNN A,1
	TDZA T,T
	MOVSI T,1
	PUSHJ P,PUT2		;MAKE SEGMENTS IN TABLE 2
	JRST SIGLP1
SIGLP2:	MOVE T,[XWD -=2000,-=500]
	MOVEM T,CURSE		;FIND CLOSEST TO HERE
	TRZ FLAG,IKNOW		;DON'T KNOW WHERE WE ARE YET
	PUSHJ P,FSTINI		;REINITIALIZE FREE STORAGE POINTER
	PUSHJ P,SORT		;SORT SIGNATURE
	POP P,F			;GET SAVED E INTO F
SIGLP3:	PUSHJ P,CLFND
	JUMPE A,NOBRD
	SUB A,T2S
	ADD A,T1S
	MOVE T,(A)
	TRZN T,1
	JRST SIGLP4
	MOVEI D,3
	CAMN T,CURSE
	TRNN FLAG,IKNOW
	CAIA
	MOVEI D,2
	PUSHJ P,[FIXSIG:
			ASH T,-1
			TRNE T,200000
			TROA T,400000
			TRZ T,400000
			ADD T,10(F)
			TLZ T,1
			ADD T,OFFSET
			TLZ T,1
			PUSHJ P,FIXXY
			JRST PLOTIT]
	MOVE T,-1(A)
	TRZ T,1
	MOVEM T,CURSE
	TRO FLAG,IKNOW		;NOW WE KNOW
	MOVEI D,2
	PUSHJ P,FIXSIG
	JRST SIGLP3

SIGLP4:	MOVEI D,3
	CAMN T,CURSE
	TRNN FLAG,IKNOW		;DO WE REALLY KNOW
	CAIA
	MOVEI D,2
	PUSHJ P,FIXSIG
	MOVEI D,2
	MOVE T,1(A)
	TRZ T,1
	MOVEM T,CURSE
	TRO FLAG,IKNOW
	PUSHJ P,FIXSIG
	JRST SIGLP3

NOBRD:
	MOVEI T,1
	MOVEM T,SCALE
	MOVE T,STOP
	PUSHJ P,FIXXY
	TRNN FLAG,%DOPLT
	JRST NOPLT7
	JSA 16,PLOT
	JUMP X
	JUMP Y
	JUMP [3]
NOPLT7:	OUTSTR[ASCIZ/PLOT DONE!
/]
	JRST ENDPLT
};MD
;END PC, PRINT ACTUAL MAX X,Y'S(PC), STRING SUBRS(D)
MPC,{
	TRNN FLAG,%DOPLT
	JRST NOPLT8
	JSA 16,PLOT
	JUMP [0]
	JUMP [0]
	JUMP [-3]
NOPLT8:
	OUTSTR[ASCIZ/ACTUAL MIN X = /]
	MOVE T,SMLX
	IMULI T,5
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ MAX X = /]
	MOVE T,LRGX
	IMULI T,5
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ MIN Y = /]
	MOVE T,SMLY
	IMULI T,5
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/ MAX Y = /]
	MOVE T,LRGY
	IMULI T,5
	PUSHJ P,MILOUT
	OUTSTR[ASCIZ/
PLOT DONE!
/]
	RELEAS 5,
	RELEAS 17,
	TRNN FLAG,DOMAG
	JRST ENDPLT
	MOVE TT,MAGBUF+2
	CAIG TT,=30
	PUSHJ P,ENDREC
	MOVE TT,[POINT 7,[ASCIZ/G57D10END OF PLOT, THANK YOU!*/]]
	PUSHJ P,MAGSTR
	MOVE TT,MAGBUF+2
	CAIG TT,=11
	PUSHJ P,ENDREC
	MOVE TT,[POINT 7,[ASCIZ/G01D02*M00********/]]
	PUSHJ P,MAGSTR
	RELEASE 0,
	JRST ENDPLT

CRDNAM:	'CARD  '
	'TAB   '
	0
	'DATRPH'

};MPC

ENDPLT:	TRNN FLAG,FR80
	JRST PCLOOP		;NOTHING ELSE TO DO
	MOVEI T,(<BYTE(4)0(3)7(11)1>)	;END WITH FRAME ADVANCE
	PUSHJ P,FROUT
	RELEASE F80CHN,	;RELEASE FR80 CHANNEL
	JRST PCLOOP

MD,{
PLTSTR:	SETZ B,
STRLOP:	PUSHJ P,GETCHL
	CAIN T,12
	JRST STRDN1
	IDPB T,A
	SOJA B,STRLOP
STRDN1:	MOVEI T,0
	IDPB T,A
	IMULI B,=20/5
	IMUL B,D
	POPJ P,

TITCLR:	SETZM STR1
	SETZM STR2
	SETZM STR3
DATDEF:	CALLI A,14
	MOVEM A,DRWDAT
	CALLI A,22
	IDIVI A,=1000		;GET MINUTES
	DPB A,[POINT 24,DRWDAT,23]
	POPJ P,

DOTIT:	PUSHJ P,RTIT
	JRST DATDEF

DOTITD:	PUSHJ P,RTIT
	PUSHJ P,IN
	MOVEM A,DRWDAT		;READ DATE OF DRW FILE
	POPJ P,

RTIT:	MOVEI B,STR1
	PUSHJ P,BRSTR
	MOVEI B,STR2
	PUSHJ P,BRSTR
	MOVEI B,STR3
BRSTR:	MOVEI C,1(B)
BRSTR1:	PUSHJ P,IN
	MOVEM A,(C)
	TRNE A,376
	AOJA C,BRSTR1
	SUBI C,1(B)
	IMUL C,[-5]
	TLNE A,774000
	SUBI C,1
	TLNE A,3760
	SUBI C,1
	TDNE A,[17700000]
	SUBI C,1
	TRNE A,77400
	SUBI C,1
	IMULI C,=20/5*4		;SIZE 4
	MOVEM C,(B)
	POPJ P,

STRDON:	ADDM B,X
	MOVEI TT,FRTXT7
	TRNE FLAG,FR80
	PUSHJ P,FRTXT
	TRNN FLAG,%DOPLT
	POPJ P,
	JSA 16,SYMBOL
FRTXT7:	JUMP X
	JUMP Y
	JUMP D
	JUMP [0]
STRPNT:	JUMP 0
	JUMP [XWD 5,5]
	POPJ P,

MONTAB:	ASCIZ/JAN/
	ASCIZ/FEB/
	ASCIZ/MAR/
	ASCIZ/APR/
	ASCIZ/MAY/
	ASCIZ/JUN/
	ASCIZ/JUL/
	ASCIZ/AUG/
	ASCIZ/SEP/
	ASCIZ/OCT/
	ASCIZ/NOV/
	ASCIZ/DEC/


;BOX DEFINITIONS
DEFINE BXY(X,Y,FLAVOR)
{
%I←←0
IFIDN{FLAVOR}{I}{%I←←1}
	XWD	-(X)/10*2,(Y)/10*2+%I
}

BOXWID←←AW*5

RADIX =10

BOXTAB:
	BXY	0,0
	BXY	0,1000,I
	BXY	BOXWID,1000
	BXY	BOXWID,0
	BXY	BOXWID-3500,0,I
	BXY	BOXWID-3500,1000
	BXY	3000,1000,I
	BXY	3000,0
	BXY	3000,600,I
	BXY	0,600
	BXY	1000,600,I
	BXY	1000,0
	BXY	1000,300,I
	BXY	3000,300
BOXLEN←←.-BOXTAB
	BXY	BOXWID-250,600	;STANFORD ARTIFICIAL
	BXY	BOXWID-150,200	;INTELLIGENCE PROJECT
	BXY	<(BOXWID-500)/2>,600;TITLE 1
	BXY	<(BOXWID-500)/2>,200;TITLE 2
	BXY	2500,100	;DATE
	BXY	2800,900	;APPROVED BY
	BXY	900,500		;DRAWN BY
	BXY	500,200		;INITIALS
	BXY	1250,600	;SIGNATURE
	BXY	2875,350	;FILENAME

RADIX =8

};MD
;MAGTAPE OUTPUT ROUTINES
MPC,{
MAGSTR:	ILDB T,TT
	JUMPE T,CPOPJ
	PUSHJ P,MAGCHR
	JRST MAGSTR

MAGLNS:	PUSHJ P,ENDCHK
	PUSHJ P,MAGG01
	PUSHJ P,MAGD0
	MOVEI T,"2"
	PUSHJ P,MAGCHR
MGSTAR:	MOVEI T,"*"
	JRST MAGCHR

MAGLIN:	PUSHJ P,ENDCHK
	PUSHJ P,MAGG01
	PUSHJ P,MAGD0
	MOVEI T,"1"
	PUSHJ P,MAGCHR
	JRST MGSTAR

MAGPAD:	MOVE T,CURSE
	PUSHJ P,FIXXY
	PUSHJ P,MAGLNS	;MOVE INVISIBLE
	MOVE T,MAGBUF+2
	CAIG T,7
	PUSHJ P,ENDREC
	MOVE TT,[POINT 7,[ASCIZ/G55D03*/]]
	JRST MAGSTR	;FLASH

MAGTXT:	PUSHJ P,MAGLNS	;MOVE INVISIBLE
	MOVE TTT,TTPNT
	HRLI TTT,(<POINT 7,0>)
	SETZ T,
MAGTX1:	ILDB TT,TTT
	JUMPE TT,.+2
	AOJA T,MAGTX1
	IMULI T,4		;4 OUT FOR 1 IN
	ADDI T,6+7		;6 OTHER CHARS + 7 ENDING CHARS
	CAML T,MAGBUF+2		;ENOUGH ROOM?
	PUSHJ P,ENDREC		;NO SPACE, FLUSH TO RECORD END
	MOVEI T,"M"
	PUSHJ P,MAGCHR
	MOVE TT,CSIZ		;GET CHAR SIZE FROM HERE
	ADDI TT,=50
	CAILE TT,=54
	JRST [	OUTSTR[ASCIZ/CHAR. SIZE TO LARGE, USING SIZE 5
/]
		MOVEI TT,=54
		JRST .+1]
	PUSHJ P,MAGDEC
	MOVE TT,[POINT 7,[ASCIZ/G52/]]
	SKIPE ANGLE		;HORZ OR VERT?
	MOVE TT,[POINT 7,[ASCIZ/G53/]]
	PUSHJ P,MAGSTR
	MOVE TTT,TTPNT
	HRLI TTT,(<POINT 7,0>)
MAGHV1:	ILDB T,TTT
	JUMPE T,MAGTXE		;DONE
	SKIPN TT,ONETAB(T)
	JRST [	OUTSTR[ASCIZ/NO "D" CODE FOR "/]
		OUTCHR T
		OUTSTR[ASCIZ/"
/]
		JRST MAGHV1]
	PUSH P,TTT
	MOVEI T,"D"
	PUSHJ P,MAGCHR
	PUSHJ P,MAGDEC		;PUT OUT "D" CODE
	PUSHJ P,MGSTAR		;AND STAR
	POP P,TTT
	JRST MAGHV1

MAGTXE:	MOVE TT,[POINT 7,[ASCIZ/G01D02*/]]
	JRST MAGSTR		;USE THIS TO TERMINATE TEXT
MAGG01:	MOVE TT,[POINT 7,[ASCIZ/G01X/]]
	PUSHJ P,MAGSTR
	MOVE TT,X
	IMULI TT,5
	PUSH P,TT
	SKIPGE (P)
	PUSHJ P,[MINUS:	MOVEI T,"-"
			JRST MAGCHR]
	POP P,TT
	MOVMS TT
	PUSHJ P,[MAGDEC:IDIVI TT,=10
			HRLM TTT,(P)
			JUMPE TT,MAGDC1
			PUSHJ P,MAGDEC
		MAGDC1:	HLRZ T,(P)
			ADDI T,60
			JRST MAGCHR]
	MOVEI T,"Y"
	PUSHJ P,MAGCHR
	MOVE TT,Y
	IMULI TT,5
	PUSH P,TT
	SKIPGE (P)
	PUSHJ P,MINUS
	POP P,TT
	MOVMS TT
	JRST MAGDEC

MAGD0:	MOVEI T,"D"
	PUSHJ P,MAGCHR
	MOVEI T,"0"
	JRST MAGCHR

ENDCHK:	MOVE T,MAGBUF+2
	CAILE T,=19
	POPJ P,
ENDREC:	PUSH P,A
	MOVE A,MAGBUF+2
	ADDI A,2		;3 INTO NEXT RECORD
ENDRC1:	PUSHJ P,MGSTAR
	SOJG A,.-1
	POP P,A
	POPJ P,
BCDTAB:	REPEAT 40,<0>
	20		;SPACE
	16		;!
	37		;"
	0		;#
	53		;$
	75		;%
	0		;&
	14		;'
	34		;(
	74		;)
	54		;*
	60		;+
	33		;,
	40		;-
	73		;.
	21		;/
	12		;0
	1		;1
	2		;2
	3		;3
	4		;4
	5		;5
	6		;6
	7		;7
	10		;8
	11		;9
	15		;:
	52		;;
	57		;<
	13		;=
	17		;>
	0		;?
	0		;@
	61		;A
	62		;B
	63		;C
	64		;D
	65		;E
	66		;F
	67		;G
	70		;H
	71		;I
	41		;J
	42		;K
	43		;L
	44		;M
	45		;N
	46		;O
	47		;P
	50		;Q
	51		;R
	22		;S
	23		;T
	24		;U
	25		;V
	26		;W
	27		;X
	30		;Y
	31		;Z
	55		;[
	76		;\
	36		;]
	72		;↑
	77		;←
	REPEAT 40,<0>

ONETAB:
	FOR I←0,37
<	0
>
	=10		;SPACE
	FOR I←41,53
<	0
>
	=51		;,
	=39		;-
	=50		;.
	=37		;/
	FOR I←=40,=49
<	I
>
	FOR I←72,100
<	0
>
	FOR I←=11,=36
<	I
>
	FOR I←133,177
<	0
>
	0


MAGCHR:	MOVE T,BCDTAB(T)	;AGG!
	JUMPE T,BITCH
	SOSG MAGBUF+2
	OUT TRWCHN,
	CAIA
	JRST [	OUTSTR[ASCIZ/MAGTAPE OUTPUT ERROR.
START OVER./]
		HALT .+1]
	IDPB T,MAGBUF+1
	POPJ P,

BITCH:	OUTSTR[ASCIZ/CHAR. WITH NO BCD EQUIVALENT, THIS IS IMPOSSIBLE!
/]
	HALT CPOPJ
PTAPE:	SOSG TAPHD+2
	OUT TAP,
	CAIA
	JRST [	OUTSTR[ASCIZ/DRILL TAPE OUTPUT ERROR!
/]
		HALT .+1]
	IDPB T,TAPHD+1
	POPJ P,

GETMES:	MOVEI B,0	;NO CHARS YET!
	SETZ C,
	MOVE A,[POINT 7,STRING]
CHRGET:	PUSHJ P,GETCHL
	ANDI T,177
	CAIN T,12
	JRST CHRDON
	CAIN T,"*"	;CAN'T BE IN MESSAGE
	AOJ C,
	SKIPE BCDTAB(T)	;MUST HAVE BCD EQUIVALENT
	SKIPN ONETAB(T)	;AND MUST BE PLOTTABLE!
	AOJ C,
	IDPB T,A
	AOJA B,CHRGET
CHRDON:	JUMPE B,NOSPCX
	LDB T,A
	CAIN T,40	;SPACE ALREADY?
	JRST NOSPCX
	MOVEI T,40
	IDPB T,A
	IDPB T,A
	ADDI B,2
NOSPCX:	MOVEI T,0
	IDPB T,A
	CAIG B,=40	;TOO MANY CHARS?
	JUMPE C,CPOPJ	;NO, ILL CHAR?
	CAILE B,=40
	OUTSTR[ASCIZ/TOO MANY CHARS.
/]
	JUMPE C,.+2
	OUTSTR[ASCIZ/ILLEGAL CHAR. IN STRING!
/]
	OUTSTR[ASCIZ/TRY AGAIN!
/]
	JRST GETMES


};MPC
FROUT:	SOSG FRBUF+2
	OUT F80CHN,
	CAIA
	JRST [	OUTSTR[ASCIZ/FR-80 OUTPUT ERROR!
/]
		HALT FROUT]
	IDPB T,FRBUF+1
	POPJ P,

MPC,{
FRFIXX:
FRFIXY:
	PUSH P,TT
	IMUL T,FRFUDG
	IDIVI T,=10		;ACCOUNT FOR EXTRA FACTOR OF TEN IN FRFUDG
	POP P,TT
	ADDI T,20000		;16384/2
};MPC
MD,{
FRFIXX:	PUSH P,TT
	HLRE TT,OFFSET
	SUB T,TT
	IMUL T,FRFUDG
	IDIVI T,=10
	POP P,TT
	ADDI T,FRMAX-100-FRXFDG	;KEEP AWAY FROM EDGE
	JRST FRFIX

FRFIXY:	PUSH P,TT
	HRRE TT,OFFSET
	SUB T,TT
	IMUL T,FRFUDG
	IDIVI T,=10		;ACCOUNT FOR EXTRA FACTOR OF TEN IN FRFUDG
	ADDI T,FRYFDG+100	;KEEP AWAY FROM EDGE
	POP P,TT
FRFIX:
};MD
	CAIGE T,FRMAX
	JUMPGE T,.+2
	OUTSTR[ASCIZ/FR80 WRAP-AROUND!
/]
	ANDI T,FRMAX-1
	POPJ P,

FRLNS:	TDZA TT,TT		;INVISIBLE
FRLIN:	MOVEI TT,(<BYTE(4)10>)	;VISIBLE
	MOVE T,X
	CAMN T,LASTX
	JRST YONLY
	MOVEM T,LASTX
MPC,{	SUB T,XOFF	};RE-CENTER
	PUSHJ P,FRFIXX
	TRO T,(<BYTE(4)2>)
	TDO T,TT
	PUSHJ P,FROUT		;X PART
	MOVE T,Y
	CAMN T,LASTY		;NEED Y PART?
	POPJ P,			;NO
	MOVEM T,LASTY
MPC,{	SUB T,YOFF	};RE-CENTER
	PUSHJ P,FRFIXY
	CAIG T,FRMAX-FRYFDG
	CAIGE T,FRYFDG
	OUTSTR[ASCIZ/FR80 Y VALUE OVERFLOW!
/]
	TRO T,(<BYTE(4)1>)
	JRST FROUT		;AND Y PART

YONLY:	MOVE T,Y
	CAMN T,LASTY
	POPJ P,
	MOVEM T,LASTY
MPC,{	SUB T,YOFF	}
	PUSHJ P,FRFIXY
	CAIG T,FRMAX-FRYFDG
	CAIGE T,FRYFDG
	OUTSTR[ASCIZ/FR80 Y VALUE OVERFLOW!
/]
	TRO T,(<BYTE(4)3>)
	TDO T,TT
	JRST FROUT

FRLINS:	CAIN D,2
	JRST FRLIN		;VISIBLE
	JRST FRLNS		;INVISIBLE

FRTXT:	PUSH P,TT
	PUSHJ P,FRLNS		;INVISIBLE
	MOVEI T,777777
	MOVEM T,LASTY
	MOVEM T,LASTX		;FLUSH THESE
	POP P,TT
	MOVE T,@3(TT)		;GET ROTATION
	CAMN T,LSTROT		;DIF?
	JRST OLDROT
	MOVEM T,LSTROT
	LSH T,1
	ANDI T,7
	TRO T,(<BYTE(3)2(6)10>)
	PUSHJ P,FROUT
OLDROT:	MOVE T,@2(TT)
	IMUL T,FRFUDG
	PUSH P,TT
	IDIVI T,=10			;ACCOUNT FOR EXTRA FACTOR OF 10 IN FRFUDG
	CAILE T,777
	MOVEI T,777
	CAMN T,LSTSPC			;NEW CHAR SPACING?
	JRST OLDSPC
	MOVEM T,LSTSPC
	TRO T,(<BYTE(3)2(6)11>)		;SET CHAR SPACING
	PUSHJ P,FROUT
	MOVE T,LSTSPC			;GET CHAR SPACING
	MOVE TT,LSTSPC			;AND ANOTHER COPY
	LSH TT,-3			;TO 1/8
	SUB T,TT
	CAILE T,777
	MOVEI T,777
	TRO T,(<BYTE(3)2(6)24>)		;SET CHAR HEIGHT 7/8 TIMES SPACING
	PUSHJ P,FROUT
OLDSPC:	POP P,TT
	MOVEI T,(<BYTE(3)2(6)4>)
	PUSHJ P,FROUT			;TYPE MODE
	PUSH P,A
	SKIPA A,4(TT)
FRSTR:	PUSH P,A
	HRLI A,(<POINT 7,0>)
	SETZ T,
FRSLOP:	ILDB TT,A
	JUMPE TT,FRSTDN
	MOVEM TT,1(P)
	MOVE TT,IIITAB(TT)
	JUMPE TT,[	OUTSTR[ASCIZ/ILLEGAL CHAR "/]
			OUTCHR 1(P)
			OUTSTR[ASCIZ/"
/]
			JRST FRSLOP]
	PUSHJ P,FRCHR
	JRST FRSLOP

FRSTDN:	POP P,A
	MOVEI TT,203
	PUSHJ P,FRCHR
	JUMPE T,CPOPJ
	MOVEI TT,0
FRCHR:	LSH T,9
	IOR T,TT
	TRNN T,777000
	POPJ P,
	PUSHJ P,FROUT
	SETZ T,
	POPJ P,
IIITAB:	0
	436		;↓
	401		;α
	402		;~
	660		;∧
	657		;¬
	405		;ε
	413		;π
	410		;λ
	0		;TAB
	0		;LF
	424		;INTEGRAL SIGN
	425		;PLUS MINUS
	0		;CR
	0		;∞
	427		;∂
	0		;⊂
	0		;⊃
	420		;∩ PRINT AS OMEGA
	0		;∪
	0		;∀
	0		;∃
	0		;⊗
	0		;↔
	537		;_
	434		;→
	534		;!~!
	650		;≠
	647		;≤
	651		;≥
	0		;≡
	652		;∨
FOR I←40,77
<	400+I
>
	540		;@
FOR I←101,133
<	400+I
>
	437		;\
	535		;]
	435		;↑
	433		;←
	500		;`
FOR I←141,173
<	400+I
>
	576		;|
	0		;ALTMODE
	575		;RIGHT CURLY BRACKET
	536		;HAT
MPC,{
SETTRW:	MOVSI T,'MAG'
	JRST SETIT

SETDRL:	MOVSI T,'DRL'
	JRST SETIT
};MPC
SETF80:	MOVSI T,'F80'
	JRST SETIT
MD,{
SETSIG:	MOVSI T,'SIG'
	JRST SETIT
};MD
SETPLT:
MD,{	MOVSI T,'PLT'	}
MPC,{	MOVSI T,'PCP'	}
SETIT:	MOVEM T,EXTSAV
SETNAM:	OUTSTR [ASCIZ/FILENAME?/]
SETIT1:	MOVE T,EXTSAV
	MOVEM T,FILEXT
	SETZM FILEXT+1		;CLEAR THIS WORD
	SETZM FILPPN		;HIS OWN AREA
	PUSHJ P,GETWRD		;SCAN FILENAME
	CAIN T,"@"
	JUMPE TT,INDIR
	CAIN T,12
	JUMPE TT,CPOPJ		;LET HIM OUT IF HE TYPES NOTHING
	JUMPN TT,NOLSTG
	CAIE T,"∃"
	JRST NOLSTG
	PUSHJ P,GETWRD
	JUMPN TT,ILLNAM
	SKIPN TT,SAVNAM
	JRST ILLNAM
NOLSTG:	MOVEM TT,FILNAM		;SAVE FILENAME
	CAIN T,"["		;ANY EXTENSION?
	JRST NOEXT		;NO
	CAIN T,12
	JRST NOEXT		;NO
	CAIE T,"."
	JRST [	ILLNAM:	PUSHJ P,IERR;ILLEGAL BREAK CHARACTER
			JRST SETNAM]
	PUSHJ P,GETWRD		;SCAN EXTENSION
	HLLZM TT,FILEXT		;SAVE IT.
NOEXT:	CAIN T,12		;HERE TO SCAN PPN
	JRST CPOPJ1		;LEAVE NOW
	CAIE T,"["
	JRST ILLNAM		;MUST BE [
	PUSHJ P,GETWRD		;SCAN P.
	JUMPE TT,ILLNAM
	PUSHJ P,RJUST
	HRLZM TT,FILPPN		;AND SAVE
	CAIE T,","		;BETTER BE COMMA
	JRST ILLNAM
	PUSHJ P,GETWRD		;SCAN PN.
	JUMPE TT,ILLNAM
	PUSHJ P,RJUST
	HRRM TT,FILPPN		;AND SAVE
	CAIE T,"]"		;BETTER END WITH THIS
	JRST ILLNAM
	PUSHJ P,GETWRD		;MAKE SURE HE DIDN'TT TYPE TO MUCH
	JUMPN TT,ILLNAM		;LOSE IF HE DID
	CAIE T,12
	JRST ILLNAM		;DIDN'TT END WITH LF
	JRST CPOPJ1
	
RJUST:	TRZ TT,-1		;THREE LETTERS ONLY
	CAIA
	LSH TT,-6
	TRNN TT,77		;RIGHT JUSTIFIED YET?
	JRST .-2		;NO
	POPJ P,
	
GETWRD:	SETZ TT,		;WORD WILL ACCUMULATE HERE
	MOVE A,[POINT 6,TT]	;BYTE POINTER TO DEPOSIT CHARACTERS
	MOVEI TTT,6		;MAX CHAR COUNT
GETCHR:	PUSHJ P,GETCHL		;READ A CHAR
	CAIN T,40		;AND SPACES
	JRST GETCHR
	CAIL T,"0"		;NUMBERS ARE LEGAL
	CAILE T,"9"
	CAIA
	JRST CHROK
	CAILE T,"z"
	POPJ P,			;BREAK CHAR.
	CAIL T,"a"
	SUBI T,40		;CHANGE LOWER CASE TO UPPER
	CAIL T,"A"		;NOW ONLY UPPER CASE LETTERS ARE LEGAL
	CAILE T,"Z"
	POPJ P,			;BREAK
CHROK:	SOJL TTT,GETCHR		;HAVE WE DONE SIX ALREADY
	SUBI T,40		;NO, MAKE IT SIXBIT
	IDPB T,A		;STORE
	JRST GETCHR

MILIN:	PUSHJ P,DECIN
	JFCL
	IMULI TTT,=200		;HIGH PART(INCHES) TO PLOTTER STEPS
	CAIN T,"."		;ANY FRACTIONAL PART?
	PUSHJ P,DIGIN
	POPJ P,
	IMULI T,=20
	ADDM T,TTT
	PUSHJ P,DIGIN
	POPJ P,
	IMULI T,=2
	ADDM T,TTT
	PUSHJ P,DIGIN
	POPJ P,
	JRST .-2

DIGIN:	PUSHJ P,GETCHL
	CAIL T,"0"
	CAILE T,"9"
	POPJ P,
	SUBI T,60
	JRST CPOPJ1

DECIN:	SETZ TTT,
READN:	PUSHJ P,GETCHL
	CAIL T,"0"
	CAILE T,"9"
	JRST ENDNUM
	IMULI TTT,=10
	ADDI TTT,-60(T)
	JRST READN
ENDNUM:	CAIN T,12
	JRST CPOPJ1
	POPJ P,

MILOUT:	SKIPGE T
	OUTCHR["-"]
	MOVMS T
	IDIVI T,=1000
	HRLM TT,(P)
	PUSHJ P,DECOUT
	OUTCHR["."]
	HLRZ T,(P)
	CAIGE T,=100
	OUTCHR["0"]
	CAIGE T,=10
	OUTCHR["0"]
DECOUT:	IDIVI T,=10
	HRLM TT,(P)
	JUMPE T,.+2
	PUSHJ P,DECOUT
	HLRZ T,(P)
	ADDI T,60
	OUTCHR T
	POPJ P,

↑GETYES:
	PUSHJ P,GETCHL
	CAIE T,"Y"
	CAIN T,"y"
	AOS (P)
	PUSH P,T
	CAIA
GETCR:	PUSHJ P,GETCHL
	CAIE T,12
	JRST GETCR
	POP P,T
	POPJ P,
INDIR:	TROE FLAG,IFLAG
	JRST IERR
	PUSH P,EXTSAV
	MOVSI T,'PIF'
	MOVEM T,EXTSAV
	PUSHJ P,SETIT1
	JRST [	TRZ FLAG,IFLAG
		POP P,EXTSAV
		POPJ P,]
	POP P,EXTSAV
	TRZ FLAG,IFLAG
	INIT ICHN,0
	'DSK   '
	IBUFR
	HALT .-3
	LOOKUP ICHN,FILNAM
	JRST [	OUTSTR[ASCIZ/INDIRECT FILE NOT FOUND!
/]
		TRZ FLAG,IREAD
		JRST SETNAM]
	MOVEI T,IBUFRD
	EXCH T,JOBFF
	INBUF ICHN,1
	MOVEM T,JOBFF
	TRO FLAG,IREAD
	JRST SETNAM

IERR:	TRZE FLAG,IREAD
	JRST IERR1
	CLRBFI
	POPJ P,

IERR1:	OUTSTR[ASCIZ/ERROR IN INDIRECT FILE!
/]
IERR2:	OUTSTR[ASCIZ/END OF INDIRECT FILE!
/]
	RELEASE ICHN,
	POPJ P,

GETCH:	TRNE FLAG,IREAD
	JRST GETCHF
	INCHRW T
	CAIN T,15
	JRST .-2
	POPJ P,

GETCHL:	TRNE FLAG,IREAD
	JRST GETCHF
	INCHWL T
	CAIN T,15
	JRST .-2
	POPJ P,

GETCHF:	SOSG IBUFR+2
	IN ICHN,
	CAIA
	JRST [	STATO ICHN,1B22
		OUTSTR[ASCIZ/INPUT ERROR ON I-FILE!
/]
		TRZ FLAG,IREAD
		PUSHJ P,IERR2
		JRST GETCHL]
	ILDB T,IBUFR+1
	JUMPE T,GETCHF
	MOVE T,@IBUFR+1
	TRNN T,1
	JRST NOSKIP
	MOVNI T,5
	ADDM T,IBUFR+2
	AOS IBUFR+1
	JRST GETCHF
NOSKIP:	LDB T,IBUFR+1
	CAIE T,12
	CAIN T,15
	JRST GETCHF
	CAIE T,"∀"
	JRST ECHO
	OUTCHR [15]
	MOVEI T,12
ECHO:	OUTCHR T
	POP